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

  • 本文关键字:内存 gc Git git git-svn git-gc
  • 更新时间 :
  • 英文 :


最终更新和修复:这里的解决方案是两件事的结合:使用Windows Git而不是Graham Borland建议的Cygwin Git,以及Git配置设置pack.threads = 1gc.aggressiveWindow = 150

我有一个很大的本地Git存储库,一个git svn clone的SVN存储库,大约有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

我在Cygwin中运行Git 1.7.5.1,在64位双核Win7机器上使用4GB RAM。.git目录当前的空间略大于6.1GB。

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

我也尝试过——根据谷歌的建议——对我的.gitconfig文件的[pack]部分进行各种摆弄;最完整的是来自StackOverflow的另一个问题。我的.gitconfig现在有以下相关行,但设置这些似乎没有区别:

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

关于如何获得gitgc我的存储库的任何建议?

Edit: Mark Longair建议对.gitconfig文件进行更多更改。我在下面画了新的线条。但是这些变化没有任何影响。

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

Edit 2: Michael Krelin建议增加swap/page文件大小(这里是WinXP的说明,Win7也类似)。我试过了,但是没有什么不同,实际上我只是增加了可用的最大大小,而且看起来好像Windows从来没有尝试过增加它正在使用的页面文件的大小。

我现在正在研究这是由内存限制引起的还是由Cygwin强加的。为了检查"强加",我正在尝试以管理员权限运行Cygwin。为了检查"内部"(看起来更有可能),我正在玩Cygwin的最大内存设置。

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

我有同样的问题,尝试了上述的解决方案,但没有成功。但是我的git gc问题是在我将大的图像文件添加到repo后开始的,所以我创建了.gitattributes文件并关闭了这些大文件的增量压缩:

*.tga -delta
*.psd -delta

运行本地Windows客户端(如msysGit)可能比尝试在Cygwin中执行更幸运。

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

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

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

在共享Linux主机上避免这个错误的唯一方法是添加

  [pack]
    packSizeLimit = 64m
    threads = 1

.gitconfig

最重要的是"threads = 1"

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

相关内容

  • 没有找到相关文章

最新更新