git push 在 HTTP/1.1 100 之后卡在(哑)https 上继续

标签 git git-push

我正在尝试推送一些更改,但是 git push 挂起。当我运行 git push 时,我看不到任何输出,似乎什么也没有发生。 top 中没有任何事件,也没有发生任何事情的迹象。

我不控制 git 托管服务。我使用的是 HTTPS 网址。我相信托管服务使用的是愚蠢的 HTTPS,而不是 git 的“智能 HTTP”协议(protocol)。在客户端,我使用 Mac OS X,并且通过 Homebrew 安装了 git 1.8.1.1(但使用 Xcode 命令行工具中包含的 git 版本似乎没有什么不同)。注销并重新登录似乎没有帮助。我可以从不同的 Linux 机器 pull 和推送到这个托管服务/存储库。

下面是一些调试输出,显示 git push 在客户端发出 PROPFIND 请求后挂起,从服务器获得 HTTP/1.1 100 Continue 响应,然后什么也没有发生:它只是卡住了。

我如何让它工作?是否有任何我可以尝试的故障排除步骤?

$ GIT_CURL_VERBOSE=1 git push -v
Pushing to https://secure2.svnrepository.com/redacted/redacted/
* About to connect() to secure2.svnrepository.com port 443 (#0)
*   Trying 67.228.18.88...
* Connected to secure2.svnrepository.com (67.228.18.88) port 443 (#0)
* Connected to secure2.svnrepository.com (67.228.18.88) port 443 (#0)
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: C=US; OU=Domain Control Validated; CN=secure2.svnrepository.com
*    start date: 2012-01-09 16:16:59 GMT
*    expire date: 2015-02-09 02:52:45 GMT
*    subjectAltName: secure2.svnrepository.com matched
*    issuer: O=AlphaSSL; CN=AlphaSSL CA - G2
*    SSL certificate verify ok.
> GET /redacted/redacted/info/refs?service=git-receive-pack HTTP/1.1
User-Agent: git/1.8.1.1
Host: secure2.svnrepository.com
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache

< HTTP/1.1 401 Authorization Required
< Date: Wed, 23 Jan 2013 03:29:36 GMT
< Server: Apache/2.2.3 (Red Hat)
< WWW-Authenticate: Basic realm="redacted"
< Content-Length: 493
< Content-Type: text/html; charset=iso-8859-1
< 
* Ignoring the response-body
* Connection #0 to host secure2.svnrepository.com left intact
* Issue another request to this URL: 'https://secure2.svnrepository.com/redacted/redacted/info/refs?service=git-receive-pack'
* Re-using existing connection! (#0) with host (nil)
* Connected to (nil) (67.228.18.88) port 443 (#0)
* Server auth using Basic with user 'redacted'
> GET /redacted/redacted/info/refs?service=git-receive-pack HTTP/1.1
Authorization: Basic redacted=
User-Agent: git/1.8.1.1
Host: secure2.svnrepository.com
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache

< HTTP/1.1 200 OK
< Date: Wed, 23 Jan 2013 03:29:36 GMT
< Server: Apache/2.2.3 (Red Hat)
< Last-Modified: Wed, 23 Jan 2013 03:00:40 GMT
< ETag: "143802e-3b-e6374600"
< Accept-Ranges: bytes
< Content-Length: 59
< Content-Type: text/plain; charset=UTF-8
< 
* Connection #0 to host (nil) left intact
* Re-using existing connection! (#0) with host (nil)
* Connected to (nil) (67.228.18.88) port 443 (#0)
* Server auth using Basic with user 'redacted'
> GET /redacted/redacted/HEAD HTTP/1.1
Authorization: Basic redacted=
User-Agent: git/1.8.1.1
Host: secure2.svnrepository.com
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache

< HTTP/1.1 200 OK
< Date: Wed, 23 Jan 2013 03:29:36 GMT
< Server: Apache/2.2.3 (Red Hat)
< Last-Modified: Wed, 16 Jan 2013 21:05:31 GMT
< ETag: "d1802c-17-3d0d7cc0"
< Accept-Ranges: bytes
< Content-Length: 23
< Content-Type: text/plain; charset=UTF-8
< 
* Connection #0 to host (nil) left intact
* About to connect() to secure2.svnrepository.com port 443 (#0)
*   Trying 67.228.18.88...
* Connected to secure2.svnrepository.com (67.228.18.88) port 443 (#0)
* Connected to secure2.svnrepository.com (67.228.18.88) port 443 (#0)
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: C=US; OU=Domain Control Validated; CN=secure2.svnrepository.com
*    start date: 2012-01-09 16:16:59 GMT
*    expire date: 2015-02-09 02:52:45 GMT
*    subjectAltName: secure2.svnrepository.com matched
*    issuer: O=AlphaSSL; CN=AlphaSSL CA - G2
*    SSL certificate verify ok.
> PROPFIND /redacted/redacted/ HTTP/1.1
User-Agent: git/1.8.1.1
Host: secure2.svnrepository.com
Accept: */*
Depth: 0
Content-Type: text/xml
Content-Length: 181
Expect: 100-continue

< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 401 Authorization Required
< Date: Wed, 23 Jan 2013 03:29:37 GMT
< Server: Apache/2.2.3 (Red Hat)
< WWW-Authenticate: Basic realm="redacted"
< Content-Length: 493
< Content-Type: text/html; charset=iso-8859-1
* the ioctl callback returned 0
< 
* Ignoring the response-body
* Connection #0 to host secure2.svnrepository.com left intact
* Issue another request to this URL: 'https://secure2.svnrepository.com/redacted/redacted/'
* Re-using existing connection! (#0) with host (nil)
* Connected to (nil) (67.228.18.88) port 443 (#0)
* Server auth using Basic with user 'redacted'
> PROPFIND /redacted/redacted/ HTTP/1.1
Authorization: Basic redacted=
User-Agent: git/1.8.1.1
Host: secure2.svnrepository.com
Accept: */*
Depth: 0
Content-Type: text/xml
Content-Length: 181
Expect: 100-continue

< HTTP/1.1 100 Continue

我的 Mac OS X 机器上没有 strace,我不知道如何使用 dtruss 查看它卡在什么系统调用上因为 dtruss 要求我是 root,然后 git push 会以不同的方式工作。

更新:我已经在装有 git 1.8.1.4 和 strace 的 Linux 机器上重现了这个。运行 strace 在它挂起之前显示如下内容:

sendto(4, <redacted>..., 314, 0, NULL, 0) = 314
recvfrom(4, "\27\3\1\0000", 5, 0, NULL, NULL) = 5
recvfrom(4, "E\202\271\21\236p\200\346\374\3641\355\t\275\rLi\202T)\326\271l/\351\f\357\2769Jb\22"..., 48, 0, NULL, NULL) = 48
select(5, [4], [4], [], {0, 729000}) = 1 (out [4], left {0, 728997})
poll([{fd=4, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=4, events=POLLOUT|POLLWRNORM}], 2, 0) = 1 ([{fd=4, revents=POLLOUT|POLLWRNORM}])
select(5, [4], [], [], {0, 729000}) = 0 (Timeout)
poll([{fd=4, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
...last 2 lines repeat infinitely...

所以它似乎在等待从服务器接收一些东西。

此外,我在运行 git 1.7.4.4 的旧 Linux 机器上尝试使用 GIT_CURL_VERBOSE=1 git push -v 进行类似的跟踪,它以相同的前缀开始,然后从那里继续。在装有较新 git 的破机器上:

$ grep '^> [A-Z]' git-1.8.1.1-trace.stderr
> GET /redacted/redacted/info/refs?service=git-receive-pack HTTP/1.1
> GET /redacted/redacted/info/refs?service=git-receive-pack HTTP/1.1
> GET /redacted/redacted/HEAD HTTP/1.1
> PROPFIND /redacted/redacted/ HTTP/1.1
> PROPFIND /redacted/redacted/ HTTP/1.1

在带有旧 git 的旧机器上,一切正常:

$ grep '^> [A-Z]' git-1.7.4.4-trace.stderr
> GET /g_wagner/c79-s13/info/refs?service=git-receive-pack HTTP/1.1
> GET /g_wagner/c79-s13/info/refs?service=git-receive-pack HTTP/1.1
> GET /g_wagner/c79-s13/HEAD HTTP/1.1
> PROPFIND /g_wagner/c79-s13/ HTTP/1.1
> PROPFIND /g_wagner/c79-s13/ HTTP/1.1
> HEAD /g_wagner/c79-s13/info/refs HTTP/1.1
> HEAD /g_wagner/c79-s13/objects/info/packs HTTP/1.1
> MKCOL /g_wagner/c79-s13/info/ HTTP/1.1
> LOCK /g_wagner/c79-s13/info/refs HTTP/1.1
> GET /g_wagner/c79-s13/objects/info/packs HTTP/1.1
...
> UNLOCK /g_wagner/c79-s13/info/refs HTTP/1.1

查看两台机器上的完整跟踪,我看不出有问题的 PROPFIND 请求(第二个 PROPFIND)中发送的内容有什么不同:两个请求看起来是相同的,除了 User-Agent : 标题。

最佳答案

我遇到了具有相同症状的问题(进程在 HTTP/1.1 100 Continue 处挂起)。

我找到了一个为我解决问题的提交:http-push.c: make CURLOPT_IOCTLDATA a usable pointer ,它在 GIT 版本 v2.0.3 中可用。

显然用户没有在服务器上正确验证,即使从通信中看起来确实如此。

问题很奇怪,因为对你来说,它出现在一台机器上,而不是另一台安装了相同 GIT 版本的机器上,对我来说,GIT 在一个月内停止工作,我真的不能说是什么原因。

或者,如果可能的话,使用允许其他协议(protocol)的 GIT 服务提供商:SSH 或 HTTPS,这些协议(protocol)的调试要好得多。


对于 Windows 用户,这是我对 git-http-push 2.1.0-rc2 的看法构建(基于 msysGit project instructions )

要向后移植到您的 msysGit 安装,请将其解压缩并在 msysGit 安装文件夹中复制到/覆盖 libexec\git-core\git-http-push.exe

问题已报告here .

更新

最新msysGit (Git-1.9.4-preview20140815) 包含向后移植的错误修复。

关于git push 在 HTTP/1.1 100 之后卡在(哑)https 上继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488077/

相关文章:

Git - pull 时忽略目录,推送时不忽略目录

git - 无法推送到 Windows 上的 git 裸存储库

Git:将所有对象推送到远程存储库(不仅是引用,而且绝对是所有 blob、树和提交)

git - 在 `cap deploy` 期间 checkout 不同的 Git 分支并工作是否安全?

git - "fatal: You are on a branch yet to be born"在这种情况下意味着什么

git - 总是覆盖一个 git 部署分支

git - 在预推 Hook 中克隆 GIT 存储库时出现异常 "working tree already exists"

git - 防止 git stash 使用非托管文件?

windows - Git for Windows (Git Bash) 中的包管理?

git - 如何配置 'git push -u'来推断远程分支名称?