我正在设置测试架构。在该系统中,VM必须测试代码的特定修订版。 VM完全干净,并且没有repo的本地(可更新)版本。代码通过ssh托管在现场git服务器上,用户名为git。我完全可以控制两台机器。
简单的解决方案是:
git clone --no-checkout git@gitserver:reponame.git
git checkout 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
这样做有效,但做得太多了:它通过网络传输完整的历史记录,如果可能的话我想避免这种情况。
在文档中,我git clone
可以选择--branch
,但这并不允许我指定特定的修订版。如果愿意,这与--depth 1
结合使用对我有用。
另一种方法是使用git archive --remote
。我理解允许它获得任意修订的安全含义,在这种情况下这不是问题,所以我运行
git config --global --bool --add uploadArchive.allowUnreachable 1
现在在git用户的shell上,我可以做到
git archive --format tar.gz --remote reponame.git 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
另外,从我的VM我可以运行
git archive --format tar.gz --remote git@gitserver:reponame.git master
然而,不工作是:
git archive --format tar.gz --remote git@gitserver:reponame.git 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
remote: fatal: no such ref: 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
remote: git upload-archive: archiver died with error
fatal: sent error to the client: git upload-archive: archiver died with error
是的,我指的是同一个回购,那个版本肯定在回购中,它只适用于版本号。可能的情况是,如果命令是通过ssh执行的,则默认的~/.gitconfig
文件没有被读取,尽管我找不到任何关于此的信息。
目前我正在使用bash作为git用户的shell。它将在未来使用受限制的shell,但为了显示基本问题,我想使用普通的shell。
我对如何获得对清洁机器的单一修订的一般性评论感兴趣,以及对无法将git archive与修订版一起使用的特定问题的解决方案。
git-upload-archive
制作了一个小包装脚本来弄清楚发生了什么事。包装脚本:
/usr/local/bin/git --version > /tmp/version
tee /tmp/stdin | /usr/local/bin/git-upload-archive "$1" | tee /tmp/stdout
并使用--exec
选项调用git-archive来运行此脚本。
编写的版本是2.0.1。然而,同样的问题仍然存在......从本地我可以用-remote和sha1 iff uploadarchive.allowunreachable
调用git-archive,远程我不能。有趣的是,请求(在/tmp/stdin
中)在两种情况下完全相同,答复是不同的。据我所知,这是因为如果通过ssh启动,git-upload-archive没有获取正确的配置;这可以通过在repo中使用本地配置来显示,在这种情况下它确实有用(我在评论中说这不起作用是因为我确实选择/usr/bin/git-upload-archive
;旧版本不允许这个配置标志。)
问题实际上可以通过调用/usr/local/bin/git upload-archive
而不是/usr/local/bin/git-upload-archive
来解决。这甚至可以作为git-archive的参数提供:--exec='/usr/local/bin/git-upload-archive'
不起作用,--exec='/usr/local/bin/git upload-archive'
。
现在问题起作用了。我仍然感兴趣(从学术角度来看)为什么git-upload-archive不能获取配置。可能这是一个应该报告给git项目的错误。
答案 0 :(得分:1)
以防其他人遇到此问题:90%的答案是在EDIT部分的问题中定义的。最后10%可能不值得真正潜入。我在此重复的重点:
uploadarchive.allowunreachable
标记。通过SSH访问git时,它可能会选择不同的版本,具体取决于您是否启动了交互式SSH会话(您的路径可能不同)。git-upload-archive
不检查全局git配置中的uploadarchive.allowunreachable
标志。这似乎是GIT中的一个错误。解决方案是不使用git-upload-archive
,而是使用git upload-archive
(即使用git脚本,将upload-archive作为第一个参数)。一种方法是向--exec='/usr/local/bin/git upload-archive'
电话提供git archive
。