远程: 致命错误: git push 时 post-receive hook 出现内存不足,realloc 失败。

3

当我在我的共享主机上使用1and1执行git push remotename branchname到我的远程仓库时,会出现以下错误信息:

Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 688 bytes | 0 bytes/s, done.
Total 7 (delta 2), reused 0 (delta 0)
remote: fatal: Out of memory, realloc failed

我在远程git仓库的hooks中设置了post-receive,代码如下:

#!/bin/sh
git --work-tree=/absolute/path/to/remotedir --git-dir=/absolute/path/to/remotedir/live.git checkout -f

当我通过SSH连接到远程服务器并输入free命令时,发现有足够的空闲内存(不确定这是否与我的问题有关):

             total       used       free     shared    buffers     cached
Mem:      12330360   11796336     534024      32080      25248    8553496
-/+ buffers/cache:    3217592    9112768
Swap:       270332       3552     266780

我的遥控器正在使用:

Debian 3.14.73-2~ui80+4
git version 2.1.4

我的本地使用的是:

OS X 10.11.2
git version 2.4.9 (Apple Git-60)

我真的不确定为什么会发生这种情况。任何帮助都将不胜感激!

编辑

当我在远程运行ulimit -a时,我得到:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 1
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 512
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) 1800
max user processes              (-u) 42
virtual memory          (kbytes, -v) 786432
file locks                      (-x) unlimited

从错误消息来看,远程主机上的git进程似乎达到了内存限制。作为后勾运行的用户,请检查该用户的限制“ulimit -a”(或)该用户是否有任何内存限制限制。此外,我将检查“dmesg”或/var/log/messages输出。 - VenkatC
@VenkatC,请查看我帖子中的编辑。内存限制是否足够?谢谢! - hot_barbara
如果“ulimit -v H”显示为无限制,则可能存在一些限制在您的shell配置文件/登录脚本中。您可以使用“ulimit -Sv unlimited”将限制暂时设置为无限制。 - VenkatC
limits.conf 中的所有行都被注释掉了,我无法编写它们,因为我没有权限这样做(我在 1and1 的共享托管套餐上)。ulimit -Hv 显示为 786432,当我发出 ulimit -Sv unlimited 命令时,似乎没有任何变化。 - hot_barbara
让我们在聊天中继续这个讨论 - VenkatC
显示剩余2条评论
5个回答

3

感谢@Елин Й.分享!但是我们遇到了一些语法问题,也许对他的服务器有效。对于1and1,我们需要使用以下git配置使远程存储库正常工作:

[core]
    packedGitWindowSize = 640m
    packedGitLimit = 640m
    preloadindex = false

[pack]
    windowMemory = 640m
    threads = 1

2
我已经成功解决了这个问题。至少几个月来我没有再遇到过这个问题。由于我尝试了许多不同的建议,做了许多试验和错误,所以我不知道哪个配置更改解决了它。
因此,我想分享我的git配置作为参考,以帮助其他人:
core.preloadindex=false
core.packedgitwindowsize=640m
core.packedgitlimit=640m
pack.windowmemory=640m
pack.threads=1

在从代码库中删除大文件后,preloadindex = false 对我来说已经足够了。 - shawncampbell

1
在1and1主机上,在命令提示符下...
输入以下命令:ulimit -a 会报告一些内容...其中之一是: open files (-n) 512 运行以下命令: ulimit -Sn unlimited 然后它会变成: open files (-n) 1024 然后git commit就可以正常工作了,不再出现错误。

1

是的,谢谢你,这就解决了。我更新了我的配置以扩大内存限制。 - hot_barbara
2
@hot_barbara 我在1and1共享主机上也遇到了完全相同的问题。你是如何更新你的配置来解决这个问题的? - Елин Й.
1
我记不清我做了什么,但无论如何都没有解决问题。我打电话给1and1,他们说由于他们认为这是git的软件问题,所以他们不支持它。如果你找到了解决方法,请告诉我们! - hot_barbara
@ЕлинЙ,你有1and1的解决方案吗? - Simon Franzen
1
@SimonFranzen 请查看我刚刚发布的答案。 - Елин Й.
@hot_barbara 我刚刚发布了一个答案,希望能对你有所帮助。 - Елин Й.

0
我在检出一个分支时遇到了这个错误。我不得不删除“.git/hooks/post-checkout”文件,这样它就可以正常工作了。只是提醒如果其他人也遇到同样的问题,请参考我的做法。

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