为什么git-upload-pack(git clone期间)挂起?

我已经读过其他几个'git挂在克隆'问题,但没有符合我的环境和细节。 我使用cygwin(msys git不是一个选项)内置的git,通过SSH克隆Linux主机上的repo。

git clone user@host:repo 

我已经在其他平台上testing了相同的主机,并且它工作正常,但是在这台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上传包输出的结束? 这是在Git或我的configuration错误?

即将到来的git1.8.5(2013年第四季度)将会记录更多的智能http协议。
见Shawn O. Pearce的 提交4c6fffe2ae3642fa4576c704e2eb443de1d0f8a1 。

有了这个详细的文档,这个想法将是监视您的git客户端和服务器之间完成的Web请求,看看是否符合下面的文档。

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


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

  • 智能服务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”,否则客户端不应该在通过ref发现获得的响应中出现的'want'命令中引用id。
  • “重叠”算法

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

一个过时的PuTTy也可能导致这种情况。 您的系统可能使用plink.exe作为GIT_SSH

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

我们遇到了类似的问题 – 我们把它归结为:我们的git repo有很多二进制文件(多个版本,在这个项目的过去1。5年)签入。 所以,我们认为这是原因。

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

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

我添加了一些爵士乐之后,我的ssh配置为了设置tmux中的窗口标题,

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

摆脱那固定我的混帐。

这为我工作,incase帮助别人。

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