【问题标题】:The remote end hung up unexpectedly while git cloninggit克隆时远程端意外挂断
【发布时间】:2011-10-14 03:15:12
【问题描述】:

我的git 客户端在尝试克隆存储库一段时间后反复失败并出现以下错误。

这可能是什么问题?

注意:我已在 GIT 托管服务提供商处注册了我的 SSH 密钥

Receiving objects:  13% (1309/10065), 796.00 KiB | 6 KiB/s
fatal: The remote end hung up unexpectedly

【问题讨论】:

  • 您能检查一下您的 git 托管服务提供商是否在线吗?
  • @Caps 它在线,网络也很好。它似乎在一段时间后持续发生。
  • 你能检查一下git config --global http.postBuffer 524288000 是否对你的克隆有任何影响吗?它有任何额外的错误消息,如'error: RPC failed; result=56, HTTP code = 0'
  • @VonC - 上面的命令执行得很好,在控制台上没有看到任何输出。
  • @Joe 你能在git config --global http.postBuffer 524288000之后克隆吗?

标签: git


【解决方案1】:

快速解决方案:

遇到这种错误,我通常首先将postBuffer 的大小提高:

git config --global http.postBuffer 524288000

(下面的一些 cmets 报告必须将值加倍):

git config --global http.postBuffer 1048576000

(对于npm publishMartin Braun 报告 in the comments 将其设置为不超过 50 000 000 而不是默认的 1 000 000)

###更多信息:

来自git config man pagehttp.postBuffer是关于:

将数据发送到远程系统时,智能 HTTP 传输使用的缓冲区的最大大小(以字节为单位)。
对于大于这个缓冲区大小的请求,使用 HTTP/1.1 和Transfer-Encoding: chunked 来避免在本地创建大量的包文件。默认为 1 MiB,足以满足大多数请求。

即使是克隆,也会产生影响,在这种情况下,OP Joe 报告:

[克隆] 现在可以正常工作了


注意:如果服务器端出现问题,并且服务器使用 Git 2.5+(2015 年第二季度),则错误消息可能会更明确。
见“Git cloning: remote end hung up unexpectedly, tried changing postBuffer but still failing”。


Kulai (in the comments) 指向this Atlassian Troubleshooting Git page,它补充说:

Error code 56 表示 curl 收到 CURLE_RECV_ERROR 的错误,这意味着在克隆过程中存在一些问题,导致无法接收数据。
这通常是由网络设置、防火墙、VPN 客户端或防病毒软件在传输所有数据之前终止连接造成的。

它还提到了以下环境变量,以帮助调试过程。

# Linux
export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1

#Windows
set GIT_TRACE_PACKET=1
set GIT_TRACE=1
set GIT_CURL_VERBOSE=1

使用 Git 2.25.1(2020 年 2 月),您会更了解这个 http.postBuffer“解决方案”。

参见brian m. carlson (bk2204)commit 7a2dc95commit 1b13e90(2020 年 1 月 22 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 53a8329,2020 年 1 月 30 日)
(Git Mailing list discussion)

docs: 增加 http.postBuffer 时提及是有价值的

签字人:brian m.卡尔森

各种情况下的用户都会发现自己遇到 HTTP 推送问题。

这些问题通常是由防病毒软件、过滤代理或其他中间人情况引起的;其他时候,它们是由于网络的简单不可靠性。

不过,网上发现的 HTTP 推送问题的常见解决方法是增加 http.postBuffer。

这不适用于上述任何情况,仅在极少数情况下有用:本质上,当连接不正确支持 HTTP/1.1 时。

记录何时提高此值是适当的以及它实际上做了什么,并劝阻人们不要将其用作推送问题的通用解决方案,因为它在那里无效。

所以git config http.postBuffer 的文档现在包括:

http.postBuffer

将数据发送到远程系统时,智能 HTTP 传输使用的缓冲区的最大大小(以字节为单位)。
对于大于此缓冲区大小的请求,使用 HTTP/1.1 和 Transfer-Encoding: chunked 来避免在本地创建海量包文件。
默认为 1 MiB,这对于大多数请求来说已经足够了。

请注意,提高此限制仅对禁用分块传输编码有效,因此仅应在远程服务器或代理仅支持 HTTP/1.0 或不符合 HTTP 标准的情况下使用。
提高此限制一般来说,对于大多数推送问题来说,这不是一个有效的解决方案,但会显着增加内存消耗,因为即使是小推送也会分配整个缓冲区

【讨论】:

  • 这对我也有用,尽管我对何时通过ssh:// 进行传输感到有点困惑。
  • 感谢这个技巧奏效了,但它的价值是答案中给出的两倍。
  • 也许文档有误,但是当您通过 HTTP 获取/克隆时,不会发生 POST。我很困惑为什么postBuffer 设置对克隆或获取有任何影响。
  • @Astravagrant 好的,我已经更新了答案以使该值更加可见。
  • 当心:我在提升 postBuffer 时遇到了 npm publish 的几个问题。当我将其设置为50000000 时,问题就消失了。顺便说一下,默认值是1000000
【解决方案2】:

Bitbucket 出现同样的错误。修复者

git config --global http.postBuffer 500M
git config --global http.maxRequestBuffer 100M
git config --global core.compression 0

【讨论】:

  • 尝试了这里发布的所有解决方案,但只有这个解决方案有效!
【解决方案3】:

http.postBuffer 技巧对我有用。然而:

对于遇到此问题的其他人,这可能是 GnuTLS 的问题。如果您设置了详细模式,您可能会看到潜在的错误类似于下面的代码行。

不幸的是,到目前为止,我唯一的解决方案是使用 SSH。

我看到elsewhere 发布的解决方案可以使用 OpenSSL 而不是 GnuTLS 编译 Git。有一个针对问题here 的有效错误报告。

GIT_CURL_VERBOSE=1 git clone https://github.com/django/django.git

Cloning into 'django'...
* Couldn't find host github.com in the .netrc file; using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.131... * Connected to github.com (192.30.252.131) port 443 (#0)
* found 153 certificates in /etc/ssl/certs/ca-certificates.crt
*    server certificate verification OK
*    common name: github.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: 
*    start date: Mon, 10 Jun 2013 00:00:00 GMT
*    expire date: Wed, 02 Sep 2015 12:00:00 GMT
*    issuer: C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert High Assurance EV CA-1
*    compression: NULL
*    cipher: ARCFOUR-128
*    MAC: SHA1
> GET /django/django.git/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.8.4
Host: github.com
Accept: */*
Accept-Encoding: gzip

Pragma: no-cache
< HTTP/1.1 200 OK
< Server: GitHub.com
< Date: Thu, 10 Oct 2013 03:28:14 GMT

< Content-Type: application/x-git-upload-pack-advertisement
< Transfer-Encoding: chunked
< Expires: Fri, 01 Jan 1980 00:00:00 GMT
< Pragma: no-cache
< Cache-Control: no-cache, max-age=0, must-revalidate
< Vary: Accept-Encoding
< 
* Connection #0 to host github.com left intact
* Couldn't find host github.com in the .netrc file; using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.131... * connected
* found 153 certificates in /etc/ssl/certs/ca-certificates.crt
* SSL re-using session ID
*    server certificate verification OK
*    common name: github.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: 
*    start date: Mon, 10 Jun 2013 00:00:00 GMT
*    expire date: Wed, 02 Sep 2015 12:00:00 GMT
*    issuer: C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert High Assurance EV CA-1
*    compression: NULL
*    cipher: ARCFOUR-128
*    MAC: SHA1
> POST /django/django.git/git-upload-pack HTTP/1.1
User-Agent: git/1.8.4
Host: github.com
Accept-Encoding: gzip

Content-Type: application/x-git-upload-pack-request
Accept: application/x-git-upload-pack-result
Content-Encoding: gzip
Content-Length: 2299
* upload completely sent off: 2299out of 2299 bytes

< HTTP/1.1 200 OK
< Server: GitHub.com
< Date: Thu, 10 Oct 2013 03:28:15 GMT

< Content-Type: application/x-git-upload-pack-result
< Transfer-Encoding: chunked
< Expires: Fri, 01 Jan 1980 00:00:00 GMT
< Pragma: no-cache
< Cache-Control: no-cache, max-age=0, must-revalidate
< Vary: Accept-Encoding
< 
remote: Counting objects: 232015, done.
remote: Compressing objects: 100% (65437/65437), done.
* GnuTLS recv error (-9): A TLS packet with unexpected length was received.
* Closing connection #0
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

【讨论】:

  • 我得到了和你一样的详细日志。但通过使用更大的 postBuffer 值来解决。
  • git config --global http.postBuffer 10000000000000000000000000000000
  • 较新的 git 版本因“致命:'http.postbuffer' 的错误数字配置值 '100000000000':超出范围”而失败,但在我的情况下设置配置值没有帮助。
  • 我能达到的最大尺寸是100000000000000
【解决方案4】:

基于this answer,我尝试了以下(使用https url):

  1. 初始克隆 repo:

git clone --depth 25 url-here

  1. 每次尝试深度增加两次获取提交:

git fetch --depth 50

git fetch --depth 100

git fetch --depth 200

...等等

  1. 最终(当我认为获取的足够多时)我运行 git fetch --unshallow - 完成了。

这个过程显然需要更多时间,但在我的情况下,设置 http.postBuffercore.compression 并没有帮助。

UPD:我发现通过 ssh 获取适用于任何 repo 大小(意外发现),使用 git clone &lt;ssh url&gt; 完成,因为您已经创建了 ssh 密钥。获取 repo 后,我使用 git remote set-url &lt;https url to repo&gt; 更改远程地址

【讨论】:

  • git clone --depth 25 url-here 为我工作而不使用 fetch
【解决方案5】:

唯一对我有用的是使用 HTTPS 链接而不是 SSH 链接来克隆 repo。

【讨论】:

    【解决方案6】:

    这是由于互联网连接问题,我遇到了同样的问题。 我使用

    做了一个浅拷贝的代码
    git clone --depth 1 //FORKLOCATION
    

    后来使用 unshallowed 克隆

    git fetch --unshallow
    

    【讨论】:

    • 这似乎可以解决问题
    【解决方案7】:

    对于共享带宽,请在负载较少时尝试克隆。否则,请尝试使用高速连接。如果还是不行,请使用下面的命令,

    git config --global http.postBuffer 2048M
    git config --global http.maxRequestBuffer 1024M
    git config --global core.compression 9
    
    git config --global ssh.postBuffer 2048M
    git config --global ssh.maxRequestBuffer 1024M
    
    git config --global pack.windowMemory 256m 
    git config --global pack.packSizeLimit 256m
    

    然后尝试再次克隆。您可能需要根据可用内存大小更改这些设置。

    【讨论】:

      【解决方案8】:

      Obs.:更改 http.postBuffer 可能还需要通过调整 client_max_body_size 的值来为 gitlab 设置 Nginx 配置文件以接受客户端更大的主体大小。

      但是,如果您可以访问 Gitlab 机器或其网络中的机器,则有一种解决方法,那就是使用 git bundle

      1. 转到源计算机上的 git 存储库
      2. 运行git bundle create my-repo.bundle --all
      3. 将 my-repo.bundle 文件传输(例如,使用 rsync)到目标计算机
      4. 在目标机器上,运行git clone my-repo.bundle
      5. git remote set-url origin "path/to/your/repo.git"
      6. git push

      一切顺利!

      【讨论】:

        【解决方案9】:

        如果您使用 https 并且遇到错误。

        我使用 https 而不是 http,它解决了我的问题

        git config --global https.postBuffer 524288000
        

        【讨论】:

        • 就我而言,它不适用于 http.postBuffer 所以我尝试按照您的建议使用 https.postBuffer 。这个解决方案奏效了。谢谢!
        • 如果我使用 ssh 会怎样?我无法移动到 http/https。
        【解决方案10】:

        使用以下命令后我得到了解决方案:

        git repack -a -f -d --window=250 --depth=250

        【讨论】:

        • 当 clone 还没有创建本地 git repo 时,你将如何运行它?
        • 终于在这个问题上苦苦挣扎,除了这个命令和git push origin main之外,一切都不起作用。谢谢
        【解决方案11】:

        我遇到了同样的问题, 我用试错法解决了这个问题。我更改了 core.compression 值,直到它起作用。

        3 次尝试后,我从“git config --global core.compression 1”开始

        “git config --global core.compression 4”对我有用。

        【讨论】:

          【解决方案12】:

          嗯,我想推出一个 219 MB 的解决方案,但我没有运气

          git config --global http.postBuffer 524288000
          

          无论如何,拥有 525 MB 的后缓冲区有什么意义?这很愚蠢。于是看了下下面的git错误:

          Total 993 (delta 230), reused 0 (delta 0)
          POST git-receive-pack (5173245 bytes)
          error: fatal: RPC failed; curl 56 SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054
          

          所以 git 想要发布 5 MB,然后我将发布缓冲区设置为 6 MB,它可以工作

          git config --global http.postBuffer 6291456
          

          【讨论】:

          • 这确实有道理。我查看了 15 mb 的 repo 大小。 ssh 和 HTTPS 都抱怨同样的错误,ssh 不太有用。我已经从 github 克隆了没有问题的大型项目,这个项目位于 bitbucket 上,它只是不喜欢大型项目并且下载速度很慢。同样的事情发生在 gitlab 上。设置任何东西都不能解决问题。这里的问题是遥控器。转移到 github 将我的后缓冲区设置为接近 15M 的 repo 大小似乎确实让我通过了,我不相信它仍然是完整的解决方案。
          • git config --global http.postBuffer 157286400 ,我在 buffer 中设置了这个,改变我的 wifi 就可以了。
          【解决方案13】:

          /etc/resolv.conf 中添加该行到文件末尾

          options single-request
          

          【讨论】:

          • 如果 postBuffer 没有帮助,我建议接下来尝试这个答案,因为它对我有用。
          【解决方案14】:

          我遇到了同样的问题,它与互联网连接不良有关,所以在尝试了一些 git 配置后,我刚刚断开了我的网络并再次连接,它可以工作了!

          似乎在连接丢失(或触发这种情况的操作)之后,git被卡住了。

          我希望它可以对这里的更多人有所帮助。

          最好的,

          【讨论】:

            【解决方案15】:

            我也遇到了同样的问题。这个问题的原因是 Kurtis 对 GNUTLS 的描述。

            如果你有同样的原因,而且你的系统是Ubuntu,你可以通过ppa:git-core/ppa安装最新版本的git来解决这个问题。命令如下。

            sudo add-apt-repository ppa:git-core/ppa
            sudo apt-get update
            sudo apt-get git
            

            【讨论】:

            • apt-get git??
            【解决方案16】:

            从托管在由弹性 beanstalk 管理的 AWS EC2 实例上的远程 git 存储库克隆数据(通过 HTTP)时,我遇到了这个问题。 克隆本身也在 AWS EC2 实例上完成。

            我尝试了所有上述解决方案及其组合:

            • 设置 git 的http.postBuffer
            • 设置http.maxrequestbuffer
            • 关闭 git 压缩并尝试“浅”git clone 然后git fetch --unshallow - 请参阅fatal: early EOF fatal: index-pack failed
            • 调整 GIT 内存设置 - packedGitLimit 等人,请参见此处:fatal: early EOF fatal: index-pack failed
            • 调整 nginx 配置 - 将 client_max_body_size 设置为大值和 0(无限制);设置proxy_request_buffering off;
            • 在 /etc/resolv.conf 中设置 options single-request
            • 使用trickle 限制 git 客户端吞吐量
            • 使用 strace 跟踪 git clone
            • 考虑更新 git 客户端

            在这一切之后,我仍然一遍又一遍地面临同样的问题,直到 我发现问题在于 Elastic Load Balancer (ELB) 断开连接。 在直接访问 EC2 实例(托管 git 存储库的那个)而不是通过 ELB 之后,我终于设法克隆了 git 存储库! 我仍然不确定哪个 ELB(超时)参数对此负责,所以我仍然需要做一些研究。

            更新

            似乎通过将超时时间从 20 秒提高到 300 秒来更改 AWS Elastic Load Balancer 的 Connection Draining policy 为我们解决了这个问题。

            git clone 错误和“连接耗尽”之间的关系很奇怪,对我们来说并不明显。可能是连接耗尽超时更改导致 ELB 配置发生了一些内部更改,从而解决了连接过早关闭的问题。

            这是 AWS 论坛上的相关问题(尚无答案):https://forums.aws.amazon.com/thread.jspa?threadID=258572

            【讨论】:

            • 很好,比我的回答更具体。 +1
            【解决方案17】:

            浪费了几个小时尝试其中一些解决方案,但最终将其追溯到公司 IPS(入侵保护系统)在传输一定数量的数据后断开连接。

            【讨论】:

              【解决方案18】:

              我也遇到了类似的问题,但我的工作是竹子。 Bamboo 无法对缓存的存储库进行本地克隆(本地但通过 SSH 代理),我删除了缓存,之后它工作了,但是任何时候它试图从本地缓存克隆都会失败。似乎竹版本的 SSH 代理本身不是 git 的问题。

              【讨论】:

                【解决方案19】:

                我在 Kubuntu 中使用 git 时遇到了这个问题。我还注意到网络的整体不稳定并找到了solution

                在 /etc/resolv.conf 中 将行添加到文件末尾

                选项单请求

                这修复了每次域名解析之前的延迟,并且 git 在此之后开始像魅力一样工作。

                【讨论】:

                  【解决方案20】:

                  解决了WIFI路由器设置:

                  当我使用设置 PPPoE(通过 wifi 路由器自动登录)在 wifi 中时,我遇到了同样的问题。

                  Git 下载速度很慢 15kb。

                  packet_write_wait:连接到 17.121.133.16 端口 22:管道损坏 致命:远端意外挂断 致命:早期EOF 致命:索引包失败

                  解决方案: 1.更改设置为动态IP,重启wifi路由器。 2.从网页浏览器登录到互联网服务提供商门户(不要配置PPPoE,从wifi路由器自动登录)。

                  更改 Git 后下载速度为 1.7MiB。

                  【讨论】:

                    【解决方案21】:

                    使用ssh而不是http,这不是这个问题的好答案,但至少它对我有用

                    【讨论】:

                      【解决方案22】:

                      这解决了我的问题:

                      git clone --depth=20 https://repo.git -b master
                      

                      【讨论】:

                        【解决方案23】:

                        上面的技巧对我没有帮助,因为 repo 大于 github 允许的最大推送大小。起作用的是https://github.com/git-lfs/git-lfs/issues/3758 的建议,建议一次推一点:

                        如果您的分支历史悠久,您可以尝试推送一个较小的 一次提交的数量(比如 2000 次),如下所示:

                        git rev-list --reverse master | ruby -ne 'i ||= 0; i += 1; puts $_ if i % 2000 == 0' | xargs -I{} git push origin +{}:refs/heads/master
                        

                        这将遍历 master 的历史,一次推送 2000 个对象。 (当然,您可以在两者中替换不同的分支 如果你喜欢的话。)完成后,你应该能够推动 掌握最后一次,事情应该是最新的。如果2000太 很多,你又遇到了问题,你可以调整数字,所以它是 更小。

                        【讨论】:

                        • 我 8 岁回答的有趣替代方案。赞成。
                        【解决方案24】:

                        我必须删除git clone 命令的分支标志。

                        【讨论】:

                          【解决方案25】:

                          在 MacOSX High Sierra 上,我的解决方案是:

                          brew install git-lfs
                          

                          我的存储库被克隆,没有任何错误。

                          【讨论】:

                            【解决方案26】:

                            增加 postBuffer 大小和 maxRequestBuffer 将帮助您解决这个问题。只需按照步骤操作即可。

                            步骤:

                            1 .打开终端或 Git Bash 并使用“cd”转到您要克隆 repo 的位置。

                            2.设置压缩为0

                            git config --global core.compression 0
                            

                            3.设置postBuffer大小

                            git config --global http.postBuffer 1048576000
                            

                            4.设置maxRequestBuffer大小

                            git config --global http.maxRequestBuffer 100M
                            

                            5.现在开始克隆

                            git clone <repo url>
                            

                            6.等待克隆完成。

                            谢谢。快乐编码!!!

                            【讨论】:

                              【解决方案27】:

                              这可能就像服务器问题一样简单。如果使用 GitHub,请查看https://twitter.com/githubstatus。刚才第一次看到这个,发现GitHub's having a wobble。几分钟后,它再次正常工作。

                              【讨论】:

                                【解决方案28】:

                                这对我有用,因为没有指定标准名称服务器,所以设置了 Google 的名称服务器,然后重新启动网络:

                                sudo echo "dns-nameservers 8.8.8.8" >> /etc/network/interfaces && sudo ifdown venet0:0 && sudo ifup venet0:0
                                

                                【讨论】:

                                  【解决方案29】:

                                  我发现我的问题出在 .netrc 文件上,如果您也是这样,那么您可以执行以下操作:

                                  打开您的 .netrc 文件并对其进行编辑以包含 github 凭据。 输入nano ~/netrcgedit ~/netrc

                                  然后包括以下内容: *机器github.com

                                  登录用户名

                                  密码保密

                                  机器 api.github.com

                                  登录用户名

                                  密码秘密*

                                  您可以在此处包含原始密码,但出于安全考虑,请在此处生成身份验证令牌 github token 并将其粘贴到您的密码位置。

                                  希望这对某人有所帮助

                                  【讨论】:

                                    【解决方案30】:

                                    我在使用 BitBucket 时遇到了同样的错误。我所做的是从我的 repo 的 URL 中删除 https 并使用 HTTP 设置 URL。

                                    git remote set-url origin http://mj@bitbucket.org/mj/pt.git
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2015-04-18
                                      • 2016-04-23
                                      • 2013-02-20
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多