git push在Total行后挂起

316

我的 git push 在完成推送后卡住了。我正在执行 git push 命令。

Counting objects: 51, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (47/47), done.
Writing objects: 100% (47/47), 27.64 MiB | 6.47 MiB/s, done.
Total 47 (delta 4), reused 0 (delta 0)

这里它一直挂起,我不得不使用control-c回到命令行。过去我已经使用这个项目提交了几次,没有问题。我尝试在我的机器上使用其他存储库,它们都可以正常工作。这是怎么回事?


8
类似 "strace -efile -f git push" 这样的命令可能会更详细地显示出卡住的位置。 - Eric Johnson
远程 repo 有任何变更吗?例如已安装长时间运行的 post-receive hook? - Gavin
1
不,我正在使用Bitbucket,所以我无法访问所有内容。我开始觉得这只是一个需要很长时间的大型传输。在推送时是否有任何进度指示器? - Patrick Jackson
你正在推送的仓库权限出了问题,还是该位置磁盘空间不足了?我见过这两个问题。此外,运行 git gc 可能会有所帮助。 - qwerty9967
2
遇到了完全相同的问题:在我的情况下,服务器上的git用户没有拥有裸仓库 - root拥有它(忘记了chown中的-R)。 - Fabio
你需要做的唯一事情就是等待。 - pusswzy
39个回答

546

https://git-scm.com/docs/git-config#Documentation/git-config.txt-httppostBuffer

http.postBuffer

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

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

解决方案

  1. 将Git缓冲区大小增加至您的存储库中最大的单个文件大小

  2. git config --global http.postBuffer 157286400

  • 参考 Git push 失败 - 客户端意图发送过大的分块体 的解决方法,对 ngnix 反向代理进行配置。将此参数增加到您的仓库中最大单个文件的大小。

  • 按照 无法克隆或拉取由于 git 出站代理 所述的绕过出站代理的步骤操作。


  • 38
    疯了,其他的解决方案都对我没用。我不知道为什么它在等待了几个小时后没有打印错误信息而是一直挂起... - Ercksen
    115
    答案是 git config --global http.postBuffer 157286400。这个数字在末尾少一个0也应该没问题。 - aroth
    11
    这怎么不是被接受的答案呢?这个解决了问题。 - Graciela Carrillo
    5
    看起来这个有效。很有趣,这里有很多人回答网络活动之类的问题,却没有意识到有多少人遇到无网络活动的挂起问题,我可以重复尝试,然后奇迹般地通过,然后又多次挂起。非常糟糕的问题,没有错误,Git 的用户界面也很有缺陷,但每个人都在使用它,很奇怪... - Renetik
    5
    这是正确的答案!如果您看到了,请点赞以将其推到榜首。在大多数情况下,得到最多赞的答案可能并不正确。 - topherPedersen
    显示剩余22条评论

    229

    这并不是什么问题。我只需要等到上传完成即可。我添加了几个大文件,但没有进度指示器。也许其他人会觉得这很有帮助。


    44
    在我的情况下,2KB的文件并不大...网络连接很好,但仍然会卡住,让人感到非常烦恼。 - Rami Dabain
    2
    这很有帮助。好在我没有打断它 :P - Glogo
    2
    @Pieter - 我得到了完全相同的结果 - 没有明显的网络活动(尽管它是一个相当大的推送),但最终完成了。 - Andy
    9
    这个界面设计相当糟糕,在“完成”后继续执行操作但没有用户反馈。 - Hernán Eche
    5
    我有一个大小为27MB的推送,已经停滞了24个小时(我甚至没有注意到它没有工作,回到电脑上发现git push命令仍然卡住了)。非常困惑。按照Faiz Ahmad Dae在下面的答案中所述增加http.postBuffer的大小解决了我的问题。 - postylem
    显示剩余7条评论

    121

    尝试:

    git gc

    我也曾遇到过相同的问题,但是对于非常小的文件而言等待并不能解决问题。解决方案是运行 git gc(垃圾回收),以重新计算仓库中的差异。


    当我执行 git pull --all 时,我遇到了同样的问题,但是我通过执行 git gc 然后再次执行 git pull --all 来解决了它,谢谢。 - masaya
    我一次性删除了一堆较大的文件,我认为这是导致我的问题挂起的原因。这是对我有效的解决方案。在处理完成后(即总行),我的程序一直挂起。所以,我只是终止了程序,然后运行了 git gc,接着运行了 git push,然后它就正常工作了。 - AndrewGB
    2
    我的救星!感谢大家,也感谢 @mat! - M. Gara
    git gc 完成后,我进行了推送,一切都很顺利。 - michelem
    不错!这就为我解决了问题,之前唯一可行的解决办法是更改postBuffer。谢谢! - Ash West
    显示剩余3条评论

    21

    只有在我使用 git push -u origin main 命令时才有效,在 Bit Bucket 上简单使用 git push 命令并不能成功推送。


    1
    使用 git push -f origin main 会打印出类似这样的信息:fatal: the remote end hung up unexpectedly Everything up-to-date - Yogi Arif Widodo
    1
    这对于Bitbucket仓库来说是非常正确的。 - Giddy Naya
    哇,我没想到这会起作用。我正在推送到Google Cloud Source Repos。 - Luke Puplett

    14

    就像被接受的答案建议的那样,它可能只是等待的一瞬间,但在大多数情况下,它与远程权限相关。 尽管像GitHub、Gitlab或Bitbucket这样的公共git服务大多数情况下都不会出现问题,但自托管的远程服务器可能有一个特殊用户或访问组。

    而且在新的裸库上,仅更改文件夹是不够的,还需要递归更改,因为里面有一个.git文件夹。


    是的,这确实是我们本地组共享的 git 仓库上的问题。奇怪的是 git 没有给出任何错误或警告。 - Ogre Psalm33
    我以前已经做了上千次,但还是需要阅读您的答案来检查目录内的权限。谢谢! - moritz

    13
    我尝试了添加另一个本地提交并重试推送,这对我起到作用了。

    2
    更改postBuffer并没有让我通过,但这个方法确实行得通。我不能说我完全理解潜在的问题,但还是谢谢! - Joel Roberts
    这对我有用!谢谢你。 - undefined

    10

    我遇到此问题时,将终端从zsh切换到bash后问题得到解决。


    1
    不应该有任何区别。你的zsh安装可能配置错误,或者你有一个行为不当的插件。 - Eric Aya
    对我来说也是一样的,切换到bash终端解决了问题。 - Ger Mc
    我也一样。可能是什么问题? - Paul Onteri
    一样的问题,我该如何进行故障排除? - John Smith

    8

    等了两个多小时后,我的git push仍然卡住了。因此,我不得不重置到提交之前,在那里我意外上传了一张3.1mb的照片(我想这可能是冻结的罪魁祸首)。

    我找到了一个更友好的解决方案,就像@aroth分享的git config --global http.postBuffer 157286400就是答案。

    我只需打开一个新的iTerm窗口运行上述命令,然后在VSCode中的终端仍然挂起的情况下运行git push。然后我使用ctrl c关闭了VSCode中的终端会话,我又回来了。

    谢谢@aroth!


    对我来说运行得非常好! - Logemann

    4

    使用以下命令:

    git remote add origin <url>
    git push -f origin main
    

    4

    我曾经也遇到过将提交推送到GitHub的问题。在我的情况下,问题出现在一个分支上。我试图推送本地分支,但没有远程分支,而这个本地分支有一个相对较大的提交,命令是 git push --set-upstream origin <你的分支名称>。我通过在GitHub上创建一个分支并将提交推送到该分支来解决了这个问题。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接