Git无法推出错误'内存不足'

我在内存很less的服务器上使用gitosis,特别是在512 MB左右。 当我尝试推送一个大文件夹(恰好是来自Android手机的备份)时,我得到:

me@corellia:~/Configs/$ git push origin master Counting objects: 18, done. Delta compression using up to 8 threads. Compressing objects: 100% (14/14), done. fatal: Out of memory, malloc failed MiB | 685 KiB/s error: pack-objects died of signal 13 error: failed to push some refs to 'git@dagobah:Configs' 

我一直在寻找networking,尤其是: http://www.mail-archive.com/[email protected]/msg01747.html以及http://git.661346.n2.nabble。 com / out-of-memory-error-git-push-td5443705.html但是这些似乎没有帮助我有两个原因:1)当我推送时,我并不是真的内存不足。 当我在推送过程中运行“顶部”时,我得到:

 24262 git 18 0 16204 6084 1096 S 2 1.2 0:00.12 git-unpack-obje 

另外,在推动过程中,如果我运行/头/ meminfo,我得到:

 MemTotal: 524288 kB MemFree: 289408 kB Buffers: 0 kB Cached: 0 kB SwapCached: 0 kB Active: 0 kB Inactive: 0 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 524288 kB 

所以,我似乎有足够的内存空间,但实际上还是失败了,我还不足以做一个Git guru来弄清楚发生了什么。 如果有人能帮我一下,告诉我可能是什么原因导致这个问题,我能做些什么来解决这个问题,我将不胜感激。

谢谢!

编辑:

运行ulimit -a命令的输出:

 scottj@dagobah:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 204800 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 204800 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

编辑

git的对象和大小是:

 313796 .git/objects/88/7ce48679f885af4c466d4ddccef9a9954a9de6 224276 .git/objects/18/261f6a52926a756c7ecb453e025d1f25937026 6248 .git/objects/63/a0b4e622c893d3dcc162052b43301030d0c86d 5608 .git/objects/a2/0c65987656cba591171549752eb97f0207fec8 2608 .git/objects/pack/pack-3be8300f69b67fa8fa687df84bbd9b8c96e86c8e.pack 28 .git/objects/pack/pack-3be8300f69b67fa8fa687df84bbd9b8c96e86c8e.idx 24 .git/objects/c9/8909563ec60369d69ac2d317af25a44c9fc198 24 .git/objects/5d/1f74bd9bc4c575a7eeec08d59916d9829068d1 24 .git/objects/53/edad79cb051f5e7864d9d3339fa59990ccfe2d 8 .git/objects/80/dd50c7a314950e5a1f56c0210b0a91f48ee792 

这是一个有点延伸,但试试这个

 git -c core.packedGitWindowSize=32m -c core.packedGitLimit=256m push origin master 

这覆盖了一些限制从文件映射的字节数的参数。 这些是用于32位系统的默认值,64位的默认值要大得多。 我猜测你正在使用一个64位系统,这会导致git使用非常大的默认值,但是有资源约束(可能来自虚拟机上运行)触发错误。

这些configuration参数和值来自http://schacon.github.com/git/git-config.html

被推回回购的最大一滴有多大?

你可以尝试运行一个:

 find .git/objects -type f -print0 | xargs -0 du -s | sort -rn | head 

我特别从链接到的git邮件列表线索看这条消息 。

你在哪个平台/分布? Ubuntu的,红帽,centos等…既为客户端和服务器? 你推动的客户端的内存使用量是多less? 我以前曾经发生过这种情况,包括大量的修订。 我知道一个解决方法就是尽可能增量地将更改推送到服务器。 另一种解决scheme是增加你的内核内存使用量。 对于一些内核分配,有一些设置可以防止内核将最大内存分配给一个进程:

 Set Kernel Parameters Modify the "/etc/sysctl.conf" file to include the lines appropriate to your operating system. # Red Hat Enterprise Linux 3.0 and CentOS 3.x kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.shmall = 2097152 kernel.shmmin = 1 kernel.shmseg = 10 # semaphores: semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128 fs.file-max = 65536 # Red Hat Enterprise Linux 4.0 and CentOS 4.x kernel.shmmax = 536870912 kernel.shmmni = 4096 kernel.shmall = 2097152 

如果你的git进程超出限制,内核将会终止进程,尽pipe系统上报告的最大内存是可用的。

注意:请注意这些设置。 您可能不想使用该示例中的设置,因为我从我们的环境中的服务器中将其拉下。

一些额外的笔记提到:

 To Update and test kernel settings with sysctl, use following commands: List current settings: sysctl -A|grep shm sysctl -w kernel.shmmax=<value> to write in sysctl.conf sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf Disable secure linux by editing the "/etc/selinux/config" file, making sure the SELINUX flag is set as follows. SELINUX=disabled