24

我已经阅读了其他几个 '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 还是我的配置中的错误?

4

6 回答 6

2

即将推出的 git1.8.5(2013 年第四季度)将记录更多智能 http 协议。
请参阅Shawn O. Pearce提交 4c6fffe2ae3642fa4576c704e2eb443de1d0f8a1

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

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


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

  • 智能服务 git-upload-pack

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

      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
      
    • 客户端不得重用或重新验证缓存的响应。

    • 服务器必须包含足够的 Cache-Control 标头以防止响应缓存。
    • 服务器应该支持这里定义的所有功能。
    • 客户端必须在请求正文中发送至少一个“想要”命令。
    • 客户端不得在“want”命令中引用未出现在通过 ref 发现获得的响应中的 id,除非服务器宣传能力“allow-tip-sha1-in-want”。
  • 协商”算法

    (c) Send one $GIT_URL/git-upload-pack request:
    C: 0032want <WANT #1>...............................
    
于 2013-11-07T08:17:03.917 回答
1

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

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

摆脱那个固定我的git。

于 2013-12-17T06:04:40.830 回答
1

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

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

于 2017-07-23T07:18:12.583 回答
1

过时的 PuTTy 也可能导致此问题。您的系统可能正在使用plink.exeas GIT_SSH

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

于 2016-08-22T17:23:13.610 回答
0

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

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

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

于 2013-11-03T23:57:19.883 回答
0

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

于 2022-01-07T18:36:41.767 回答