我正在建立一个测试架构。在这个系统中,VM 必须测试代码的特定版本。VM 完全干净,并且没有本地(可更新)版本的存储库。代码托管在现场 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
是的,我指的是同一个 repo,那个版本肯定在 repo 中,它只是不适用于版本号。可能的情况是,如果通过 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 调用 git-archive 并且 sha1 iffuploadarchive.allowunreachable
已设置,远程我不能。有趣的/tmp/stdin
是,两种情况下的请求(in)完全相同,但回复却不同。据我所知,这是因为如果通过 ssh 启动 git-upload-archive 没有选择正确的配置;这可以通过在存储库中使用本地配置来显示,在这种情况下它确实有效(我在评论中说这不起作用是因为我确实在接受/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 项目的错误。