Git克隆失败,出现内存不足错误-"致命错误:内存不足,分配905574791字节的malloc失败/致命错误:index-pack失败"

17

我正在尝试将一个巨大的(1.4GB)Git存储库克隆到一个只有384MB RAM的32位Debian虚拟机中。 我使用的是Git 1.7.2.5,使用SSH协议进行克隆('git clone user@host.com:/my/repo')。

克隆失败,并显示以下错误信息:

remote: Counting objects: 18797, done.
remote: warning: subobtimal pack - out of memory
remote: Compressing objects: 100% (10363/10363), done.
fatal: out of memory, malloc failed (tried to allocate 905574791 bytes)
fatal: index-pack failed

我尝试减少Git在主机端重打包时使用的内存量:

git config pack.windowMemory 10m
git config pack.packSizeLimit 20m
git repack -a -d

我的问题如下:

  1. 这是一个客户端(克隆端)的问题还是应该在我正在克隆的仓库中解决?
  2. 无论哪种情况,有什么办法可以使克隆成功吗?网上很多潜在的解决方案都涉及以下一些/所有的事情,但在这种情况下都是不可接受的:

    • 实质性更改存储库的内容(例如删除大文件)
    • 为执行克隆的虚拟机提供更多的 RAM
    • 为执行克隆的虚拟机提供 64 位虚拟 CPU
    • 通过越带频道传输(例如使用 Rsync 或 SFTP 传输 .git 目录)

预先感谢。


1
你检查过克隆机器上是否有足够的磁盘空间来容纳整个包文件(约900MB左右)了吗? - Romain
Romain:是的 - 我在执行克隆操作的机器上至少有5.5GB可用空间。 - grw
1
是的,这曾经困扰过我一次,当时我在存储库中使用了大型二进制文件。如果这是原因,请查看git-bup以寻找替代方法。 - sehe
4个回答

3

git clone不会考虑你的pack.packSizeLimit设置,它将在一个单独的包中传输所有内容 - 除非它自上次我查看以来发生了改变。

使用SCP或Rsync可能是解决你的问题的一种方式。删除“无用”的大文件,然后重新打包你尝试克隆的仓库也可能有所帮助。

给虚拟机分配更多的RAM可能有所帮助 - 我认为你不需要64位地址空间来分配900MB...你还可以分配足够的SWAP空间来处理900MB的包,而不是增加RAM。


2
嗨,Romain, 感谢您的回复。我最终给虚拟机分配了768MB的RAM,这暂时解决了问题。Git似乎确实会消耗大量内存 - 根据#git IRC频道上的Charon所说,未来的Git版本可能会有一个解决方案,可以实现“流式解压缩”,而不是在RAM中解压缩。 - grw
2
@grw:它仅在某些带宽节省操作中占用内存...这就是Git变得快速的原因。 - sehe
1
我同意@sehe所说的...只有在这是实现最佳性能的唯一方式时,Git才会占用大量内存。现在它更加成熟,人们正在努力使其在更受限制的环境下表现更好... - Romain
@Romain,我真的希望如此:D感谢大家的建议。 - grw
尝试添加swap,但运气不佳。仍无法克隆。 =/ - Translunar

0
今天我遇到了同样的问题。Git服务器内存不足,但是Gitlab报告还有可用内存。我们使用htop检查内存(显示没有可用内存),重启Gitlab后一切恢复正常。

0

抱歉,这对我也不起作用。尝试分配212211077字节失败了。 - Robbie Smith
你的操作系统是什么?(你使用的是WindowsXP吗?)你的操作系统是32位还是64位?你是如何安装Git的?(下载还是自行编译?)你的Git是32位还是64位?干杯;-) - oHo

-6
sudo git pull

每次我拉取代码时都会遇到相同的错误信息,实际上使用sudo git pull帮助我克服了这个错误信息并成功地拉取了代码。


3
我对此回答的反对意见进行简要解释:该回答指示执行违反最佳实践并本质上危险的操作。真的,大家不要这样做。 - Romain

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