git push 出现内存不足,malloc 失败。

51

我正在尝试将我的更改推送到GitHub远程,但是偶尔git因为某些原因而失败。

C:\dev\projects>git push -v
Pushing to https://user@github.com/mycompany/My-Project.git
Password for 'github.com':
fatal: Out of memory, malloc failed (tried to allocate 524288000 bytes)
fatal: write error: Invalid argument

这真的非常令人恼火。我运行了以下命令,升级了 git(它抹掉了我的设置,造成了很多痛苦,但我离题了)

git gc --auto --prune=today --aggressive
git repack

我甚至已经提高了这个值的数值

http.postbuffer

但最终它会再次失败。

这是一个典型的Rails 3.1应用程序,磁盘上的总项目大小为9.69 MB。


6
它试图分配500MB有点令人害怕 - 你是在处理巨大的东西吗? - Cascabel
不,问题就在这里,我并没有,总目录大小为55.7MB,而被忽略的日志文件大小为46MB,我已经删除了我的日志文件,请查看编辑。 - Jared Knipp
你是否包含了.git目录?(也就是说,您可能提交然后删除了很多东西?) - Cascabel
不,我运行了几个git命令,但是在删除日志文件时我关闭了rails服务器。我认为我的机器可能由于JRuby而耗尽了内存...很难想象8GB的内存会如此快地用完。 - Jared Knipp
3
当然,如果你的机器没有其他原因即将崩溃那就很好了,但 Git 这么要求 500MB 是有原因的。所以,如果你想试着找到问题所在,检查 .git 目录的大小是一个开始;如果它比你预期的要大得多,那么你可以回顾最近的历史记录,看看是否存在任何巨大的差异(例如尝试使用 git log --shortstat 命令)。 - Cascabel
显示剩余2条评论
16个回答

34

我的建议是尝试一些与打包有关的Git参数:

[pack]
   threads = 1
   deltaCacheSize = 128m
   windowMemory = 50m

对我来说最好的结果是设置git config pack.threads 1git config pack.windowMemory 50m(默认值为10m)。

尽管如此,我的主机内存不足(2GB),并且一直失败。我将库文件复制到内存更大的另一台机器上。效果有所改善,但仍然失败。

最后,我下载了最新版本的Git (https://github.com/git/git),编译并安装。只需使用相同参数运行git repack -adf就可以解决问题。之后,我运行git gc --aggressive --prune=now

在我的本地机器上修复库文件后,我将其推送到主分支并覆盖远程库:git push -f origin master

为避免类似错误,尝试不要向库中添加不必要的大文件(在我的情况下,我得到了一个3.5GB的SQL转储:)并禁用大文件(如图像、PDF、视频)的增量压缩。将以下行添加到.gitattributes:

*.pdf -delta
*.jpg -delta

Diego,你能告诉我们你将 Git 升级到哪个版本了吗? - Ahmad
你好 @Ahmad,这是很久以前的事了。我从主干构建了git。我记得在解决问题后立即发布了这个答案,所以查看“git tags” v1.8.0是最接近的方法。 - Diego Pino
在我的情况下,必须将其提高到 1024m。我有几十个200m的tar文件,这些文件已经检出了多个版本,所以也许我会采用.gitattributes 的想法。 - V. Courtois

30

使用这个:

git gc --auto --prune=today --aggressive 
git repack 
git config --global http.postbuffer 524288000 
git config --global pack.windowMemory 256m

对我来说有效了。


2
当我尝试克隆一个代码库时,修改了帖子缓冲区对我很有帮助。 - Tomáš Zato
我逐一添加了配置项 pack.threads=1pack.windowmemory=256mpack.packsizelimit=20m,但在推送时仍然失败。 直到我使用 git repack 后再次推送才成功。 - jeffsama

28

你可以尝试使用以下配置来重新打包:

git config --global pack.windowMemory 256m

@ashishsony 可能因机器而异。256m只是一个例子。 - ralphtheninja
请省略全局标志以仅限于当前存储库。对我来说,32m似乎足够了。 - Stardust

7

我遇到了同样的问题,将一些参数更改为1024m后,问题仍然存在:

[pack]
     threads = 1
     deltaCacheSize = 1024m
     packSizeLimit = 1024m
     windowMemory = 1024m
[core]
     packedGitLimit = 1024m
     packedGitWindowSize = 1024m

我认为问题与您电脑的可用RAM内存有关。我的电脑RAM内存已经很忙了,重启后我终于成功推送了更改。希望这能帮到您。

5
如果这些值没有帮助,我不确定你为什么要发布它们。这很令人困惑。 - mafu
我认为问题与您电脑的可用RAM内存有关,这是对我的正确答案。 - lekant

5

如果你使用 GitLab 并遇到此错误:

找到 GitLab 配置文件(/etc/gitlab/gitlab.rb)

更改 gitlab_rails['git_max_size'] 的值(增加一个较大的值)

然后运行:gitlab-ctl reconfigure 进行刷新。


4
git repack 
git config --global http.postbuffer 524288000 
git config --global pack.windowMemory 256m

这对我起作用了,然后执行git push。


2

我在我的 .gitconfig 文件中删除了以下设置:

[http]
postbuffer = 524288000
[pack]
windowMemory = 1024m
deltaCacheSize = 1024m
packSizeLimit = 1024m

推送又成功了。


2

我在AWS t2.small上遇到了同样的问题。同时运行着Sonar。我关闭了Sonar以释放内存,检出并重新启动了Sonar。我将增加实例大小。


实际上不需要增加内存。你只需启用 SWAP 文件即可。 - 夏期劇場

2

在我的情况下,这与客户端机器无关。这是因为运行GitLab的服务器的内存已满。我增加了虚拟机的内存,问题得到解决。


实际上不需要增加内存。你只需启用SWAP文件即可。 - 夏期劇場
为了解决上述特定问题,仅交换(swap)操作就是我认为最好的选择。因为总体上你只需要它来进行第一次推送。随后的推送将恢复到正常水平(几 KB)。 - 夏期劇場

2

如果您在 Gitlab 上,找到远程服务器上引起问题的仓库。

Gitlab 将存储库保存在此位置:

/var/opt/gitlab/git-data/repositories

找到目录并运行以下命令。
git repack -a -f -d

完成。

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