Git,致命错误:远程端意外挂起

540

当我试图运行时

git push origin master --force

我刚刚收到了

Counting objects: 2649, done.
Delta compression uses up to 2 threads.
Compressing objects: 100% (1280/1280), done.
error: RPC failed; result=22, HTTP code = 413 | 116 KiB/s   
fatal: The remote end hung up unexpectedly
Writing objects: 100% (2504/2504), 449.61 MiB | 4.19 MiB/s, done.
Total 2504 (delta 1309), reused 2242 (delta 1216)
fatal: The remote end hung up unexpectedly
Everything up-to-date

这是否与不安全有关?我尝试创建一个公钥作为“Fatal: The remote end hung up unexpectedly”的答案并重新运行它,但它仍然无法正常工作。我没有真正使用该密钥吗?如果是这样,我该如何使用它?


请输出 git remote -v 的结果。 - CharlesB
3
可能是Git将提交推送到GitHub时失败的重复问题。 - CharlesB
39
git config http.postBuffer 524288000 # 这对我有效 - Hari Das
4
我无法让任何建议的解决方案生效。然后我尝试了GitKraken。它是少数几个不使用git.exe的Git程序之一。 GitKraken可以做到这一点。在GitKraken推送存储库后,我可以切换回git.exe并同步,没有任何问题。 - lars pehrsson
1
可能是由于网络问题。 - AmiNadimi
显示剩余4条评论
54个回答

857

这是由于git/https缓冲设置引起的。

运行以下命令(参考自Git在将提交推送到GitHub时失败):

git config http.postBuffer 524288000

然后,再次运行您的原始命令。


10
请问是否可以将缓冲区设置为超过500MB?即使我将postBuffer数字调高,好像也没有什么改变…… - jowie
28
使用 --global 是个好主意吗?我经常处理大型代码库。 - DaAwesomeP
5
@shivam13juna,互联网上的内容永远不会被删除::) https://web.archive.org/web/20170119225336/http://github.com/gitlabhq/gitlabhq/issues/3099 - Roman M
36
我运行了 "git config http.postBuffer 524288000",但问题仍未解决,仍然显示相同的错误,即远程端意外挂起。 - Narendra
3
@jowie 我已经写了一个答案,试图说明为什么这个值可以高达2000000000(2 GB),以及还需要做什么才能使它正常工作。 - Asclepius
显示剩余13条评论

142

原因:Git的默认文件上传大小已超过限制。

解决方法:进入仓库,然后运行以下命令将缓冲区增加到500MB:

git config http.postBuffer 524288000

61
如果使用 ssh 而不是 http 进行提交,您也可以使用 git config ssh.postBuffer 524288000。请注意,这并没有改变原意,只是让语言更加通俗易懂。 - John M
9
有些情况下,需要运行 git config --global http.postBuffer 100000000 命令。 - Job M
执行此命令后,我收到“致命错误:不在git目录中”的提示。 - ka3ak
3
@JohnM 这个选项似乎不存在,无法在man手册或https://git-scm.com/docs/git-config 中找到相关文档。 - Nobody
我写了一个答案,试图说明为什么http.postBuffer值可能会高达2000000000(2 GB),以及还需要做什么才能使推送成功。 - Asclepius
@Nobody 这是对我有效的版本。 - zephyrus

121

为什么我不能只是从http切换到https? - DanielLC
16
为什么会出现fatal: remote origin already exists.的错误信息?这是因为在运行git remote add命令时,远程仓库origin已经存在于本地仓库中。如果想要添加一个新的远程仓库,请选择其他的名称作为远程仓库的代号。 - almaruf
18
这是因为远程的 origin 已经存在,并且你正在尝试替换它。Git 不允许这样做。所以你必须先执行 git remote rm origin,然后再尝试操作。这样就可以成功了。 - Alfie
2
如果这是一个新的克隆项目,请确保使用 git init 进行初始化。 - Raul
22
有人可以解释一下为什么这个方法是解决方案吗?作为一个经验较少的Github用户,我觉得这个问题和答案中链接的那个问题没有任何联系。当出现“remote end hung up unexpectedly”错误时,没有合理的解释说明为什么切换到SSH会解决问题,因此我犹豫不决是否要学习如何操作。 - canderson156
显示剩余7条评论

60

你可能会遇到这样的错误

error: could not lock config file .git/config: No such file or directory

那是因为你没有本地的.git/config文件。你可以通过运行以下命令使其工作:

git config --global http.postBuffer 524288000

3
当我试图在非常慢的PC上在cygwin中进行克隆时,这帮助了我 - 它一直停留在远程端,直到我使用了这个命令。 - serup
这帮助我解决了“fatal: The remote end hung up upon initial contact”问题。 - Karthic.K
这帮助我解决了我的问题,仍在2022年继续工作。 - Shamoon97

57

罪魁祸首(在我的情况下):
高延迟网络。

这不是一个确切的答案,而更像是一种观察,可能会帮助其他人。我发现这个错误偶尔会在高延迟的网络上弹出(例如,我必须使用卫星接收器来访问互联网)。网络速度很好,但延迟可能很高。注意:问题只存在于某些场景中,但我还没有确定模式是什么。

临时缓解:
我换了一个网络——我转到了一个速度较慢但延迟更低的蜂窝网络(我用手机作为热点),然后问题消失了。请注意,由于我的移动网络连接也是间歇性的,因此我只能间歇性地这样做。此外,带宽使用会增加成本。我也很幸运,因为我有这个选项可用。并非每个人都有。

我相信,在某个配置设置中,有使git或ssh或curl或其他超时更容忍这类网络的方法,但我不知道它在哪里。

对开发人员的呼吁:
这些问题对农村人口来说是一个持续的问题。请在设计系统、工具和应用程序时考虑我们。谢谢。


ssh本身具有一些调整选项(keepalives等),但主要的调整选项通常是内核级别的,需要在双方设置(例如,在GitHub上)。这是一个问题。我想为您的情况看到的是聚合器(LAGG界面样式),它可以同时使用卫星和手机网络。不幸的是,这远非易事。 - torek
我使用了Xcode附加工具中的“网络链接调节器”,并从我的Mac机器上应用了“3G”配置文件。它有效地运行了 :) - Rafat touqir Rafsun

48

其他解决方案在我的情况下都没有奏效,进行垃圾回收对我有用:

git gc --aggressive
你可以先尝试只执行git gc

42
这解决了我的问题,但它也把分离的HEAD更改压缩到一个状态中,将它们合并变得非常麻烦(所有更改都转换为ADD)。我希望在运行它之前多做一些研究。 - MatrixManAtYrService
这解决了我的问题。我的问题是(使用ssh):$ git push | 枚举对象:886,完成。| 计数对象:100%(850/850),完成。| 连接到bitbucket.org的远程主机关闭。| 致命错误:远程端意外挂起 | 压缩对象:100%(831/831),完成。| 致命错误:远程端意外挂起 - manuelpgs
Git 在执行 push 命令之前会自动执行 gc 命令。 - linjiejun
在我的情况下,我必须先拉再推,而拉取是我遇到“fatal: Out of memory, malloc failed…”错误的地方。@linjiejun - brethvoice

25

与其他回答相反 - 我在使用ssh时遇到了问题 - 我切换到https后问题得到解决。

git remote remove origin
git remote add origin https://github.com/user/repo
git push --set-upstream origin master

1
可以使用 git remote set-url origin https://github.com/user/repo。无需删除第一个。 - Maicon Mauricio
太好了!谢谢你! - TheGabornator
not solve the error - Alberto Acuña

22

如果使用GitHub,在仓库目录中运行此命令以将http.postBuffer设置为GitHub的最大允许值:

git config http.postBuffer 2147483648

如果不使用git clone而是克隆存储库,则可以使用相同选项进行克隆:
git clone -c http.postBuffer=2147483648 git@github.com:myuser/myrepo.git /path/to/myrepo

在这两种情况下,上面的数字等同于2 GiB。但是,您可能需要多达这么多的可用内存才能使用此值。
确保每次推送到GitHub时都有提交不超过此更改大小的提交。实际上,我会将提交推送大小保持在1.8 GiB以下以确保安全。这可能需要将大型提交分成较小的提交和推送。
为什么使用这个值?
使用这个特定值是因为至少在2018年,这个值被记录(存档链接)为GitHub的推送大小限制:

我们不允许超过2GB的推送

为什么不设置得更低?
一些之前的答案说将其设置为524288000(500 MiB),但这个数字似乎是随意的且没有价值。只要您的推送大小不大于设置值,任何较低的值都应该可以工作。
为什么不设置得更高?
如果您将值设置为高于2 GiB,并且如果您尝试的推送大小也更高,则可以预期在GitHub上出现文档错误:

远程:致命错误:包超过允许的最大大小


15

以下命令可能会对您有所帮助...

git config --global http.postBuffer 1048576000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

1
设置http.lowSpeedLimit和http.lowSpeedTime解决了我的问题。谢谢。 - golu_kumar

12
根据您用于向代码库推送的协议,

HTTP


git config --global http.postBuffer 157286400

参考资料:

SSH

在 Linux 机器的 ~/.ssh/config 文件中添加以下内容:

Host your-gitlab-server.com
  ServerAliveInterval 60
  ServerAliveCountMax 5
  IPQoS throughput

References:


在这个答案中,http.postBuffer 的有效设置为150 MiB。如果需要,可以像我在答案中所解释的那样,将其提高到2 GB。 - Asclepius
SSH配置刚刚解决了我在gitlab.com上的问题。非常感谢。 - Alberto
我该如何在GitHub上完成这个操作? 我的主机是github.com吗? - Giovanni

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