【问题标题】:Why would git-upload-pack (during git clone) hang?为什么 git-upload-pack(在 git clone 期间)会挂起?
【发布时间】:2013-06-08 23:27:56
【问题描述】:

我已经阅读了其他几个“git hangs on clone”的问题,但没有一个符合我的环境和详细信息。我正在使用在 cygwin 下构建的 git(msys git 不是一个选项)通过 SSH 从 Linux 主机克隆 repo。

git clone user@host:repo

我已经在其他平台上针对同一主机进行了测试,它工作正常,但在这台 Windows 机器上,克隆无限期挂起。我设置了GIT_TRACE=1,看起来问题出在这个命令上:

'ssh' 'user@host' 'git-upload-pack '\''repo'\'''

我的 SSH 密钥设置正确:ssh user@host 工作正常。当我运行命令时,我得到一堆这样结束的输出:

...
003dbbd3db63763922ad75bbeefa3811dce001576851 refs/tags/start
0000

然后它挂了 20 多分钟,这是我在杀死它之前等待的最长时间。

服务器有 Git 1.7.11.7 和 OpenSSH 5.9p1,而客户端有 Git 1.7.9 和 OpenSSH 6.1p1。

这应该是 git-upload-pack 输出的结尾吗?这是 Git 中的错误还是我的配置中的错误?

【问题讨论】:

  • 您是否尝试将克隆(从 linux/mac)复制到 windows pc 并“使用”它?可能是 Windows 的一些 git 问题(不区分大小写、字符编码……),这可能有助于追踪它。
  • 这应该来自git-upload-pack。它正在等待您(嗯,您的 git 客户端)在您提出要求时进行协商,告诉它您想要拥有什么。您真的不能使用任何其他 git 客户端进行故障排除吗?
  • @EdwardThomson 我不再可以访问那个环境,但是不,我没有使用任何其他 git 客户端的选项。服务器和客户端都是从源代码编译的,因此除了特定于平台的代码和依赖项中引入的行为之外,应该没有任何行为差异。
  • 请注意,我自己运行命令的测试不一定有效。实际客户端可能出于完全不同的原因停止执行该命令。我只是提供了该信息以防万一。
  • 在客户端使用linux时,可以使用strace来查找是哪个内核调用了客户端问题。这可以更详细地了解哪个部分失败了。

标签: windows git ssh


【解决方案1】:

我们遇到了类似的问题 - 我们将其归因于以下原因:我们的 git 存储库签入了大量二进制文件(多个版本,在该项目的过去 1.5 年中)。所以,我们认为这就是原因。

为了支持这一理论,我们有其他更新的代码库(因此没有那么多二进制文件及其版本)——它们没有表现出这种行为。

我们的设置:Linux 上的 Git 设置,伦敦和印度之间通过 T1 线路的站点到站点 VPN。

【讨论】:

  • 我的仓库确实有很多二进制对象,但在我的情况下,克隆是通过千兆本地链接。在其他平台(在 Mac、Linux、Solaris 上测试)上克隆同一个 repo 大约需要几分钟。因此,除非 Windows 上的 git 由于某种原因慢了多个数量级,这不是我在其他地方使用它的经验,否则问题可能与 repo 大小或内容无关。
【解决方案2】:

即将发布的 git1.8.5(2013 年第四季度)将记录更多智能 http 协议。
commit 4c6fffe2ae3642fa4576c704e2eb443de1d0f8a1Shawn O. Pearce

有了详细的文档,我们的想法是监控您的 git 客户端和服务器之间完成的 Web 请求,并查看这些请求是否符合下面记录的内容。

这有助于查明服务“挂起”的位置。


文件Documentation/technical/http-protocol.txt坚持:

  • Smart Service git-upload-pack

    • 客户端必须首先使用“$GIT_URL/info/refs?service=git-upload-pack”执行 ref 发现。

      C: POST $GIT_URL/git-upload-pack HTTP/1.0
      S: 200 OK
      S: Content-Type: application/x-git-upload-pack-result
      S: Cache-Control: no-cache
      S:
      S: ....ACK %s, continue
      S: ....NAK
      
    • 客户端不得重用或重新验证缓存的响应。

    • 服务器必须包含足够的缓存控制头 以防止缓存响应。
    • 服务器应支持此处定义的所有功能。
    • 客户端必须在请求正文中发送至少一个“想要”命令。
    • 除非服务器宣传“allow-tip-sha1-in-want”功能,否则客户端不得在“want”命令中引用未出现在通过 ref 发现获得的响应中的 id。
  • "negociation" algorithm

    (c) Send one $GIT_URL/git-upload-pack request:
    C: 0032want <WANT #1>...............................
    

【讨论】:

    【解决方案3】:

    为了在 tmux 中设置窗口标题,在我的 ssh 配置中添加了一些像这样的爵士乐后,我遇到了同样的问题:

    Host *
    PermitLocalCommand yes
    LocalCommand if [[ $TERM == screen* ]]; then printf "\033k%h\033\\"; fi
    

    摆脱那个固定我的 git。

    【讨论】:

      【解决方案4】:

      过时的 PuTTy 也可能导致此问题。您的系统可能将plink.exe 用作GIT_SSH

      您可以从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 安装最新的开发版本,以确保这不是问题。

      【讨论】:

        【解决方案5】:

        这对我有用,以防它帮助别人。

        检查你的 git 远程 URL。如果您使用错误的 url 类型,它可能会在跟踪中与 git-upload-pack 一起挂起。将遥控器上的 URL 从 git@github.com: 更改为 https://github.com/

        【讨论】:

        • 我对将 git@ 称为“错误”的 url 类型感到愤怒,但这种破解/解决方法确实消除了我的困扰,所以无论如何我都赞成。这似乎是托管端的错误配置(对我来说,主机是 bitbucket)。
        • 哦,是的,我为什么要这么说,好吧,一个不受支持的?哈哈。是的,我也更喜欢 git url。
        【解决方案6】:

        我的问题很简单。我更新了 VPN 客户端,git 开始挂起。我退出 VPN 客户端并重新启动它。

        【讨论】:

          猜你喜欢
          • 2015-02-11
          • 2012-07-30
          • 2015-08-28
          • 2020-09-15
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          • 2017-10-17
          • 2012-05-07
          相关资源
          最近更新 更多