【问题标题】:Git: get specific revision from remote serverGit:从远程服务器获取特定版本
【发布时间】:2014-08-24 13:23:29
【问题描述】:

我正在建立一个测试架构。在这个系统中,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 存档的特定问题的解决方案感兴趣。


编辑: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 调用 git-archive,如果设置了 uploadarchive.allowunreachable,远程我不能。有趣的是,两种情况下的请求(/tmp/stdin)完全相同,但回复却不同。据我所知,这是因为如果通过 ssh 启动 git-upload-archive 没有选择正确的配置;这可以通过在 repo 中使用本地配置来显示,在这种情况下它确实有效(我在 cmets 中说这不起作用是因为我确实选择了 /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。

【问题讨论】:

  • 您也许可以测试~/.gitconfig 理论:例如,在特定的回购配置中设置uploadArchive.allowUnreachable。或者,在服务器上,创建一个专门指向8e8fdea8f8367f4a179d2faddbaadba495d6bc12 的标签并按标签获取。如果其中任何一个有效,则表明 allowUnreachable 失败。
  • 有趣的想法。在 repo 中本地设置配置选项并没有带来改进。为该修订分配和推送标签确实可以将其存档。
  • 嗯。标签有效,但本地配置条目无效:听起来git archive 实际上并没有查看配置条目(全局本地)。请参阅 git 的 archive.c,在第 267 行附近:remote_allow_unreachable 未设置。 (这到底是什么版本的 git?具体来说是服务器上的那个。看起来这在 1.7.10 中开始受到限制,并且在 2.0.0 中添加了 allow-unreachable。)
  • 这是 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 工作的更改是什么?

标签: git git-clone git-archive


【解决方案1】:

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

  • 请注意,在 OSX Mevericks 上,默认 GIT 版本为 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 调用。

【讨论】:

  • 其实你应该把答案放在这里,在你的问题中只留下问题是什么。
  • 现在才来得及做这个,谢谢提醒。
  • 很好的反馈。然后+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2020-07-20
  • 2011-04-03
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多