3

我正在建立一个测试架构。在这个系统中,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 项目的错误。

4

1 回答 1

1

以防万一其他人遇到这个问题:90% 的答案是在 EDIT 部分下的问题中定义的。最后 10% 可能不值得真正深入研究。我在这里重复的要点:

  • 注意 OSX Mevericks 上的默认 GIT 版本是 <2.0,因此不支持该uploadarchive.allowunreachable标签。通过 SSH 访问 git 时,它可能会根据您是否启动交互式 SSH 会话来选择不同的版本(您的路径可能不同)。
  • git-upload-archive不检查uploadarchive.allowunreachable全局 git 配置中的标志。这似乎是 GIT 中的一个错误。解决方案是不使用git-upload-archive, 但是git upload-archive(即使用 git 脚本,将 upload-archive 作为第一个参数)。一种方法是提供--exec='/usr/local/bin/git upload-archive'git archive呼叫。
于 2014-08-28T09:47:26.223 回答