Git在写入对象时卡住了

164

我正在尝试执行git push -u origin master,但它一直卡在这里:

Writing objects:  99% (219/220), 12.65 MiB | 97 KiB/s

12.65 部分变化不定。当我退出进程并重新运行时,它会在 99% 处恢复,但永远无法完成,与之前相同。

它从未成功推送。这是初始提交。


您想要推送到哪里?您是使用SSH还是其他协议? - Paŭlo Ebermann
34
设置 http.postbuffer 可以帮助吗?https://dev59.com/e2w15IYBdhLWcg3wFHtZ#6849424 - VonC
4
VonC的评论很容易被忽视。它对我有效。 - Thuan
1
不可思议,这对我也起作用了。而且现在已经是2018年了。它是SSH,而不是HTTP。整个版本库只有15MB。而“远程”服务器是本地主机。停止浪漫化Git,请各位! ;) - Sz.
10个回答

383

我遵循了VonC的建议:

git config --global http.postBuffer 524288000

为日后参考,根据评论:

500 MB: 524288000 (as posted in the original answer)
1 GB: 1048576000
2 GB: 2097152000 (anything higher is rejected as 'out of range')

9
哇,谢谢你!我曾经非常苦恼,但这解决了我的问题! - Brett Thomas
7
增加缓冲区似乎解决了我的文件写入挂起问题,但我的git push从未完成(在“Writing objects:100%”后挂起)-- 以前会在25%处挂起,因此这显然有所帮助。但是,我仍然遇到了“奇怪”的行为。我重新启动了系统,这似乎解决了问题...顺便说一句...如果任何人在增加缓冲区后仍然遇到问题,重新启动系统在我的情况下很有帮助(老派的解决方案,但新启动确实有帮助)。 - twknab
6
有人能解释一下数字 524288000 是从哪里来的吗? - Ryre
9
@Ryre,它是500 MB。 - Hugo Forte
5
愿上帝保佑你和Stackoverflow,没有它们我会是一个彻头彻尾的失败者。 - buycanna.io
显示剩余4条评论

46

这是因为在仓库目录中有一个巨大的、不能被忽略的文件导致的。哎呀。

编辑

卡住的原因是该文件上传花费了很长时间。实际上,这个文件本不应该被包括在推送中。

编辑

虽然一个巨大的文件可能是导致此问题的原因,但如果你无法忽略这个文件或者必须将其推送,那么请参考这个答案。


6
是的,你的修正措施是去除了问题。为了那些真正需要推送大文件的人,@hugo-forte的答案解决了这个问题。你不必这样做,我只是认为它会更有助于更多人 - 符合 SO 的精神。 - TimoSolo
2
问题不是“我如何提交,然后推送一个巨大的文件?”而是“我的git push没有尽头。为什么?”如果您不希望推送需要很长时间,那么您可能(像我一样)并不想提交那个巨大的文件。 - mattalxndr
4
当被接受的回答得票数只有1/8时,你应该考虑更改它。 - NorCalKnockOut
1
@mattalxndr 两个答案都不完美。一个确定了原因,另一个提供了解决方案。理想的答案应该确定原因,解释为什么会产生这样的结果,并提供两种替代方案。在我看来,从当前的选项中,Hugo Forte的答案更优秀,因为它将解决问题,无论您是否打算推送该文件。它不会忽视那些犯了与您相同错误的人;它为他们解决了问题,就像为其他任何人一样,但是让他们自己删除文件,如果他们没有打算推送它。 - Zac-K
Hugo Forte的答案更优秀,因为它可以解决问题,无论您是否有意推送文件。我理解你的观点。改用@Hugo的答案。 - mattalxndr
显示剩余2条评论

12

我曾遇到写入对象 %16 时卡住然后崩溃的问题。我通过保存当前更改并克隆一个新仓库,然后将修改后的文件复制到其中来解决了这个问题。

例如,假设当前仓库为 A,则您所需执行的操作如下:

  1. mv A B
  2. git clone A
  3. mv B/* A/
  4. rm -rf B

然后提交和推送就好了。它会将移动的文件识别为已修改的文件 :)


你遇到了不同的症状。我的没有任何致命错误。 - mattalxndr

6
在我的情况下,我使用的是一个权限不足的git文件夹,它存储在与repo相同的驱动器上,但即使您使用授权的登录用户,使用ssh也可能会出现相同的情况。请检查您是否有正确的权限来写入远程repo。
示例:
初始化本地和远程repo
git init /tmp/src
git init --bare /tmp/dst
cd /tmp/src

将远程仓库添加到源代码库

src > git remote add dest /tmp/dst

模拟问题

src > chmod -R 555 /tmp/dst

添加虚假文件并推送它

src > touch a && git add a && git commit -m 'demo'
src > git push --set-upstream dest master
src > git push
Counting objects: 3, done.
Writing objects: 99% (2/3), 202 bytes | 0 bytes/s.

Git卡住了

解决方案

src > chmod -R 775 /tmp/dst

2
请考虑在您的回答中添加更多的典型细节,谢谢。 - Mirza Sisic
1
抱歉。这样好一些吗? - Naewis

3

在我的情况下,问题出在文件的大小上。通过添加一个包含所需扩展名的 .gitignore 文件,我能够忽略大部分不需要推送的文件。


3

给伊朗人

不幸的是,由于伊朗互联网的严重中断,我唯一有效的方法是使用来自通信部的DNS更改器


2

git clean -f -n 解决了我的问题。有许多未被检测到的未跟踪文件。 但是要小心,因为这会删除您目录中的文件。


10
它会删除哪些具体文件? - Jazimov
1
git clean 会清除所有未提交的文件。 -f 标志强制运行该命令,而 -n 则使其成为干运行并告诉您将要删除哪些文件。 因此... 您将看到哪些文件被删除。 所以实际上,@Jazimov,您通过在其前面放置 -f 标志来撤消 -n 标志。 https://git-scm.com/book/id/v2/Git-Tools-Stashing-and-Cleaning#_git_clean - unixcorn
@unixcorn 对,已经好几年没回答问题和评论了。 - DarkMakukudo
我没有未提交的文件,但有一些大文件随着一次提交而被删除,然后在下一次提交时被删除。这导致卡住了,在运行此命令后就立刻推送成功了。谢谢! - a.t. yilmaz

2
在我的情况下,我上传文件时遇到了缓慢的互联网上传速度,而我想要上传的文件很大。诀窍是使用 Git LFS(大文件存储),它更有耐心地上传大文件。你可以在这里找到Git LFS 教程

1
在我的情况下,我试图在未完成公司规定的情况下进行推送。 后来我了解到,我们应该以“MOBIL-XXXX”开头撰写提交消息,其中XXXX是分配给开发人员的数字(由分析师使用的另一种跟踪开发过程的工具Jira)。
请确保检查您的公司是否有类似的限制规则。

1
我在Windows 10机器上遇到了同样的问题,即“写入对象”挂起,但情况略有不同。
我遇到的问题只发生在我尝试向存储库添加新文件时。如果我更新已经存在于存储库中的文件,则一切正常,并且文件大小是否很大并不重要。我大多数时候都在尝试添加新脚本。
我尝试了互联网上找到的每种解决方案,但在我的情况下没有任何作用。最后一件事是我尝试的最后一件事实际上起作用了。似乎这是因为某些Windows权限针对特定驱动器和文件夹,阻止应用程序在这些特定文件夹中写入或更新文件,即使我使用管理员帐户登录并作为管理员运行应用程序也无济于事。所以这个命令:
attrib -r +s D:\foldername 

对我来说解决了这个问题。

只是在这里发布一下,也许有人和我遇到了同样的问题。


不仅仅是Windows!当管理员忘记给我任何权限将我的文件放到远程存储库时,我也遇到了同样的问题。为什么没有错误提示? - Wera

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