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

Git:从远程服务器获取特定版本,git,git-clone,git-archive,Git,Git Clone,Git Archive,我正在建立一个测试架构。在此系统中,虚拟机必须测试特定版本的代码。虚拟机是完全干净的,并且没有repo的本地(可更新)版本。代码由一个名为git的用户通过ssh托管在现场git服务器上。我完全控制了这两台机器 简单的解决办法是: git clone --no-checkout git@gitserver:reponame.git git checkout 8e8fdea8f8367f4a179d2faddbaadba495d6bc12 这是可行的,但做的太多了:它通过网络传输完整的历史记录,如

我正在建立一个测试架构。在此系统中,虚拟机必须测试特定版本的代码。虚拟机是完全干净的,并且没有repo的本地(可更新)版本。代码由一个名为git的用户通过ssh托管在现场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
另外,从我的虚拟机我可以运行

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股票,2.0.1通过brew安装),我围绕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归档来运行此脚本

编写的版本是2.0.1。然而,同样的问题依然存在。。。从本地,我可以使用-remote和sha1 iff
uploadarchive调用git archive。allowunreachable
已设置,远程我无法调用。有趣的是,请求(在
/tmp/stdin
中)在这两种情况下是完全相同的,而回复是不同的。就我所见,这是因为git upload archive在通过ssh启动时没有选择正确的配置;这可以通过在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项目报告的bug。

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


  • 注意,在OSX Mevericks上,默认的GIT版本是,您可能可以在特定的repo配置中测试
    ~/.gitconfig
    理论:set
    uploadArchive.allowUnreachable
    。或者,在服务器上,制作一个专门指向
    8e8fdea8f8367f4a179d2faddbaadba495d6bc12的标记,然后按标记获取。如果其中一个有效,则表明
    allowUnreachable
    失败。有趣的想法。在回购协议中本地设置配置选项并没有带来改进。为该修订分配并推送标记确实允许将其存档。Hm。标记可以工作,但本地配置条目不能:听起来好像git archive
    实际上没有查看配置条目(全局或本地)。参见git的
    archive.c
    ,第267行:
    remote\u allow\u unreachable
    未设置。(这到底是什么版本的git?特别是服务器上的版本。看起来这在1.7.10中开始受到限制,在2.0.0中添加了“允许不可访问”。)这是git 2.0.1。据我所知,服务器上正在运行git upload archive。我可以确认git archive在本地运行时确实遵守allowUnreachable标志。我的第二个示例
    git archive--format tar.gz--remote reponame.git 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
    如果未设置该选项,则失败,现在成功了。是的,当您在本地运行
    git archive
    并将
    --remote
    指向服务器时,将调用服务器上的
    git upload archive
    。这就是限制开始生效的时候。但是:“现在成功了”,即使是生的SHA-1?什么改变了原始SHA-1的工作?事实上,你应该把答案放在这里,在你的问题中留下ony,问题是什么。现在只有时间这么做,谢谢提醒。反馈很好+1那么。