Git:从远程服务器获取特定修订版

时间:2014-08-24 13:23:29

标签: git git-clone git-archive

我正在设置测试架构。在该系统中,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服务器上作为git用户。

现在在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与修订版一起使用的特定问题的解决方案。


编辑:torek给了我一些关于版本的想法(我在OSX上运行,使用git 1.8.5.2库存,并通过brew安装了2.0.1),我围绕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项目的错误。

1 个答案:

答案 0 :(得分:1)

以防其他人遇到此问题:90%的答案是在EDIT部分的问题中定义的。最后10%可能不值得真正潜入。我在此重复的重点:

  • 请注意,在OSX Mevericks上,默认GIT版本为< 2.0,因此不支持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