Git gc使用过多的内存,无法完成

时间:2011-11-21 15:39:49

标签: git git-svn git-gc

最终更新和修复:此处的解决方案结果是两件事:使用Windows Git而不是Cygwin Git作为Graham Borland suggested,以及Git配置设置pack.threads = 1gc.aggressiveWindow = 150

我有一个庞大的本地Git存储库,一个SVN存储库的git svn clone,大约有40,000次提交。我正在尝试在此存储库上运行git gc,并且无处可去:

$ git gc --auto
Auto packing the repository for optimum performance. You may also
run "git gc" manually. See "git help gc" for more information.
Counting objects: 25966, done.
Compressing objects: 100% (25249/25249), done.
fatal: Out of memory, malloc failed (tried to allocate 426523986 bytes)
error: failed to run repack

我在拥有4GB RAM的64位双核Win7机器上运行Cygwin中的Git 1.7.5.1。 .git目录目前略高于6.1GB。

我已经尝试运行git gc --aggressive,看看更完整的系统是否能够修复它,但没有运气:我收到了与上述类似的消息,尝试的大小相同malloc ,但是对象数量要高得多(计数508,485,压缩493,506)。

我也尝试过 - 就像Google-assorted twiddles对我[pack]文件的.gitconfig部分所建议的那样;最完整的来自another StackOverflow question。我的.gitconfig现在有以下相关行,但设置这些似乎没有任何区别:

[pack]
        windowMemory = 16m
        threads = 1
        window = 1
        depth = 1
        deltaCacheSize = 1

有关如何将git提交至gc我的存储库的任何建议?

修改Mark Longair suggested更多.gitconfig个文件更改。我做了哪些,下面是新行。但这些变化没有任何区别。

[core]
        packedGitWindowSize = 1m
        packedGitLimit = 256m
[pack]
        packSizeLimit = 128m

编辑2 Michael Krelin suggested增加交换/页面文件大小(WinXP指令here,它与Win7类似)。我试过了,但它没有任何区别,事实上我只增加了可用的最大大小,看起来好像Windows从未试图增加它正在使用的页面文件的大小。

我现在正在研究这是否是由Cygwin内部或强加的内存限制引起的。要检查“强制执行”,我正在尝试使用管理员权限运行Cygwin。要检查“内部”(看起来更有可能),我正在玩Cygwin's maximum memory settings

编辑3 :虽然我可能更喜欢使用Cygwin,但事实证明Windows Git客户端处理内存问题很好。似乎当我的存储库需要整洁时,我会经常回到那里。

5 个答案:

答案 0 :(得分:11)

我遇到了同样的问题,尝试了迄今为止提到的解决方案但没有成功。但是在我将大图像文件添加到repo之后,我的git gc问题就开始了,所以我创建了.gitattributes文件并为这些大文件关闭了delta压缩:

*.tga -delta
*.psd -delta

有效。

答案 1 :(得分:7)

运行本地Windows客户端(例如msysGit)可能会更幸运,而不是尝试在Cygwin中运行。

答案 2 :(得分:5)

您可能希望尝试限制为低于默认值的其他一些配置选项包括:

  • pack.packSizeLimit
  • core.packedGitWindowSize
  • core.packedGitLimit

...所有这些都记录在git config documentation中。在每种情况下,特别值得检查的是哪些单位被理解,我过去曾犯过错误。

答案 3 :(得分:3)

在共享Linux主机上唯一有助于避免此错误的是添加

  [pack]
    packSizeLimit = 64m
    threads = 1

.gitconfig

最重要的是“threads = 1”

答案 4 :(得分:1)

也许暂时添加一个比生命更大的交换文件,在其他地方喝几杯咖啡会有帮助吗?