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

38
最终更新和修复: 这里的解决方案包括两个部分:使用Windows Git而不是Cygwin Git,正如Graham Borland 建议的那样,并且设置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所建议的——对我的.gitconfig文件的[pack]部分进行各种调整;最完整的来自另一个StackOverflow问题。现在,我的.gitconfig具有以下相关行,但设置这些似乎没有任何影响:

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

有什么建议可以让我使用gitgc我的代码库吗?

编辑:Mark Longair 建议一些更改.gitconfig文件的方法。我已经进行了修改,如下所示。但是这些更改没有任何作用。

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

编辑2: Michael Krelin 建议增加交换/页面文件大小(WinXP指令在这里,Win7类似)。我尝试了那个方法,但没有任何改变,事实上我只是增加了可用的最大大小,看起来Windows从未尝试增加它正在使用的页面文件的大小。

现在我在查看是否是Cygwin内存限制造成了这个问题。为了检查"强制执行",我正在尝试以管理员权限运行Cygwin。为了检查"内部"(看起来更有可能),我正在玩一下Cygwin的最大内存设置

编辑3: 尽管我更喜欢使用Cygwin,但事实证明Windows Git客户端可以很好地解决内存问题。看来当我的存储库需要整理时,我会不时地退回到那里。

5个回答

12

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

*.tga -delta
*.psd -delta

它起作用了。


1
太棒了,它终于成功了!我一直在使用共享主机上的git存储库处理大文件时遇到麻烦,因为它会杀死占用过多内存的进程。这个方法解决了我多年来一直存在的问题 :DDDD - scone
经过许多的试错,有时候让它工作,然后在提交几次之后又让仓库再次崩溃,这带来了解决方案(至少目前是这样)。我认为这个答案应该排名更靠前。 - Michel Müller

7

如果您想在Windows上运行Git客户端,建议使用本地的Windows客户端,例如msysGit,而不是尝试在Cygwin中运行。


1
我的经验是Windows Git客户端通常处理内存管理更糟糕——我已经能够让Cygwin Git处理一个大约有15,000个提交的SVN仓库,而我尝试过的Windows Git客户端则失败了。不过还是值得一试的,我想! - me_and
哇!虽然我通常不喜欢使用 Windows Git 客户端,但那个很好用。谢谢! - me_and

6

以下是一些其他可能希望尝试将其限制为低于默认值的配置选项:

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

所有这些选项都在git config文档中有详细记录。特别值得注意的是,在每种情况下了解哪些单位得到理解,因为我过去曾犯过错误。


没有 core.deltaCacheSize。我猜你指的是 pack.deltaCacheSize,我已经在调整它了。不过现在我会尝试其余的,谢谢! - me_and
@me_and:糟糕 - 我已经从我的答案中删除了那个。 - Mark Longair
没什么运气。我会使用新的配置更新问题,但简短的版本是,您建议的更改似乎对git gc尝试分配的内存量没有任何影响。 - me_and

4
唯一避免共享Linux主机出现此错误的方法是添加以下内容:
  [pack]
    packSizeLimit = 64m
    threads = 1

to

.gitconfig

最重要的是“threads = 1”


1

也许暂时添加一个比生命更大的交换文件,然后去别处喝几杯咖啡会有所帮助?


如果今天我没有进展,我会在晚上用大容量页面文件重新启动我的电脑,并让它整夜运行... - me_and
哦,我没意识到你在使用Windows系统——我以为添加交换文件只需要在shell中输入几个命令就可以了。希望在Windows上仍然有可能实现,但你更清楚该如何操作;-) - Michael Krelin - hacker
没有运气。事实上,我增加了可用的页面文件空间,但Windows没有决定使用它,这对我来说意味着可能存在一些Cygwin内存限制问题。我正在调查这个问题... - me_and
3
也许 cygwin 实现了 ulimit?(我不确定) - Michael Krelin - hacker
1
确实似乎有类似的东西:Cygwin有一个Windows注册表设置,用于设置最大内存使用量。我在打字时正在进行更多的实验! - me_and

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