git clone失败,“致命:内存不足,malloc失败”错误

时间:2017-10-03 20:43:31

标签: git memory git-clone

当我从项目的裸存储库执行 git clone 时,在本地服务器上收到以下错误消息:

  

致命:内存不足,malloc失败(试图分配2251896833   bytes)警告:克隆成功,但结帐失败。你可以检查   用'git status'检查了什么,然后重试结帐   'git checkout -f HEAD'

我尝试按照this question下的回答更新我的~/.gitconfig文件,关闭git bash,重新启动并重试,但没有任何结果。

我最终尝试了以下配置,但结果仍然相同:

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

我甚至尝试在另一台机器上使用git gc,但不知道如何将裸存储库也用于垃圾收集。

我在git version 2.14.2.windows.1计算机下使用32 bits Windows 7,内存为4GB。

如何在git clone上解决这个致命错误?

2 个答案:

答案 0 :(得分:6)

使用Git repo是自包含且可以复制的事实,我们只需要一些方法来制作副本,并在我们的前几次尝试中从裸转换为非裸。

如果可以使用该选项,克隆仍然是初始复制的最佳形式(参见解决方法1和2)。如果没有,我们可以直接从服务器复制,如果访问可用,并手动转换(参见#3)。如果不这样做,也许复制/克隆一小部分回购邮件会有效吗?

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

登录服务器(如果您有访问权限),克隆到USB驱动器文件夹(作为非裸仓库),将USB粘贴到目标计算机,然后将其移动/复制到您想要回购的最终位置。 Git命令应该是:

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

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

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

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

解决方法3 - 从服务器复制,从裸

转换

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

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

It appears you can clone only a single branch at a time,可能符合导致记忆问题的限制:

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

请注意,您可以在服务器上创建新的分支,这些分支在历史记录中有点回归,一次性减少,但根据上面链接中的答案,您可能需要跳过一些箍来删除“单个 - 你的新回购的“分支”。

解决方法4b - 浅层回购

使用--depth <depth>和/或其他浅标签创建具有有限提交历史深度的本地存储库。来自git clone --help手册页:

  

- 深度   创建一个浅层克隆,其历史记录被截断为指定的提交数。意味着 - 单个分支,除非给出--no-single-branch来获取所有分支的提示附近的历史。如果要浅层克隆子模块,还要传递--shallow-submodules。

     

- 浅因为=   在指定时间后创建一个带有历史记录的浅层克隆。

     

- 浅排除=   创建具有历史记录的浅层克隆,不包括可从指定的远程分支或标记访问的提交。可以多次指定此选项。

     

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

解决方法4c - 一次只克隆/签出一些文件

请参阅this answer及其链接,了解如何一次下拉部分回购协议。丑陋,但可以一次克隆部分。

答案 1 :(得分:2)

如果您使用的是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

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