git clone 失败并显示“fatal: Out of memory, malloc failed”错误

11

当我在本地服务器上从项目的裸库进行git克隆时,我会收到以下错误消息:

致命错误:内存不足,malloc失败(尝试分配2,251,896,833字节)警告:克隆成功,但检出失败。您可以使用“git status”检查已检出的内容,并使用“git checkout -f HEAD”重试检出。

我尝试根据这个问题下的答案更新了我的~/.gitconfig文件,关闭了git bash并重新启动后没有任何结果。

最后我尝试了以下配置,但仍然出现相同的结果:

$ cat .gitconfig
[core]
        packedGitLimit = 1024m
        packedGitWindowSize = 1024m
[pack]
        deltaCacheSize = 1024m
        packSizeLimit = 1024m
        windowMemory = 1024m
[http]
        postBuffer = 157286400

我甚至在另一台机器上尝试了git gc,但不确定如何使裸仓库垃圾回收。

我正在使用带有Windows 732位git版本2.14.2.windows.1和4GB RAM的计算机。

如何解决git克隆时的致命错误?


裸仓库位于哪里?在云服务(如Github)上,还是在本地网络上的服务(甚至只是在本地服务器/文件中)? - LightCC
裸仓库位于本地服务器上。我有一个连接到共享文件夹的Windows驱动器。 - Cedric Zoppolo
尝试分配2251896833字节,相当于2,147MB,但你设置了1024MB的限制?你是否有2GB可用内存? - Matt Clark
是的,我有。我应该更改哪些值?全部吗?我应该将它们更改为2g吗? - Cedric Zoppolo
@MattClark,你可以回答这个问题,这样我就可以点赞了。明天我会尝试你的解决方案,因为现在我不在办公室。谢谢。 - Cedric Zoppolo
同样适用于@LightCC - Cedric Zoppolo
4个回答

13

如果你使用Linux并且拥有root访问权限,那么最简单的解决方法是增加虚拟内存。在大多数Linux系统上,你可以按照以下步骤(作为root用户)添加4GiB的虚拟内存,然后再次尝试git clone:

dd if=/dev/zero of=/var/swap.img bs=1M count=4096
chmod 0600 /var/swap.img
mkswap /var/swap.img
swapon /var/swap.img

当我遇到这个问题时,这最终成为了对我来说最简单可行的解决方案。


嗨,这对我有用,谢谢!之后我该如何撤销/重置以进行清理? - Brian Peterson
1
@BrianPeterson swapoff /var/swap/img 然后删除该文件。 - Brad Peabody
swapon:/var/swap.img:swapon 失败:无法分配内存(实际系统内存为 512MB) - fr332lanc3

12

利用 Git 仓库是自包含的并且可以直接复制的事实,我们只需要一些方法来复制并将 bare 仓库转换为非 bare 仓库,在我们的前几次尝试中。

如果可能,克隆仍然是最好的初始复制形式(参见解决方法1和2)。如果不行,如果有访问权限,我们可以直接从服务器上复制,然后手动转换它(请参见#3)。如果失败了,也许复制/克隆仓库的较小部分会奏效?

解决方法1-从服务器克隆到 USB

登录服务器(如果您有访问权限),将其克隆到 USB 驱动器文件夹中(作为非 bare 仓库),将 USB 插入目标机器,然后将其移动/复制到希望放置仓库的最终位置。Git 命令应该是:

git clone /path/to/bare/repo /local/repo/folder

我认为这不会复制任何孤立的提交(那些最终将被垃圾回收的提交)。

解决方法2-克隆到另一台电脑,然后复制

将repo克隆到另一台计算机上,以某种方式将文件夹复制/移动到目标计算机(USB,网络连接等),类似于#1。

解决方法3-从服务器复制,从bare转换

假设可以访问服务器,可能是通过网络共享而不是直接访问(否则使用#1)。将裸库本地复制,然后执行类似于这样的操作将其转换为非裸库。

解决方法4a-一次只克隆一个分支

看起来你只能一次克隆一个单独的分支, 这可能适合在限制内引起内存问题:

git clone [url/folder] -b master --single-branch [local repo folder]

请注意,您可以在服务器上创建一些稍微滞后的新分支,以便一次拉取较少的内容,但是根据上面链接中的答案,您可能需要跳过一些障碍来删除您的新存储库的“单分支性”。
解决方法4b-浅层存储库:
使用--depth <depth>和/或其他浅层标签创建具有有限提交历史深度的本地存储库。从git clone --help手册页面中获取:

--depth 创建一个浅克隆,其历史记录被截断为指定数量的提交。除非给出--no-single-branch以获取所有分支末端附近的历史记录,否则意味着--single-branch。如果要浅地克隆子模块,请还传递--shallow-submodules。

--shallow-since= 创建一个浅层克隆,其历史记录在指定时间之后。

--shallow-exclude= 创建一个浅层克隆,其历史记录不包括可从指定远程分支或标记到达的提交。此选项可以多次指定。

--[no-]single-branch 仅克隆导致单个分支尖端的历史记录,由--branch选项或主分支远程的HEAD指向指定。进一步获取到生成的存储库中的内容只会为用于初始克隆的分支更新远程跟踪分支。如果--single-branch clone时远程的HEAD没有指向任何分支,则不会创建远程跟踪分支。

解决方法4c-一次克隆/检出部分文件。

参见这个答案及其链接以获取有关如何一次仅拉取存储库的一部分的说明。虽然不太美观,但可以将其分成几部分克隆。


我无法测试这个解决方案,因为计算机最终被更换了。但是我认为解决办法1是一个好的解决方案。 - Cedric Zoppolo

3

同时也要检查ulimit。在AIX上,我有如下设置(没有出现malloc失败的问题):

> ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 64
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited

一个遇到malloc失败问题的用户有以下情况:
> ulimit -a
core file size          (blocks, -c) 1048575
data seg size           (kbytes, -d) 131072
file size               (blocks, -f) 1048575
max memory size         (kbytes, -m) 32768
open files                      (-n) 2000
pipe size            (512 bytes, -p) 64
stack size              (kbytes, -s) 32768
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited

用户的ulimits已由管理员增加;malloc失败问题已解决。 - Joseph Martin

1

git config --global http.postBuffer 524288000

#如果不够,就把它加倍! git config --global http.postBuffer 1048576000


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