【问题标题】:Git gc using excessive memory, unable to completegit gc 使用过多内存,无法完成
【发布时间】:2012-01-03 02:24:05
【问题描述】:

最终更新和修复:这里的解决方案是两件事的结合:使用 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 的建议,我还尝试了对我的 .gitconfig 文件的 [pack] 部分进行的各种旋转;最完整的来自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

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

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

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

【问题讨论】:

    标签: git git-svn git-gc


    【解决方案1】:

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

    *.tga -delta
    *.psd -delta
    

    成功了。

    【讨论】:

    • ZOMG 成功了!我在共享主机上的 git 存储库中遇到大文件时遇到问题,这会杀死占用过多内存的进程。这解决了我多年来遇到的一个问题:DDDD
    • 经过大量的试验和错误,有时让它工作,然后在几次提交后,回购再次中断,这带来了解决方案(到目前为止)。我认为这个答案应该更高。
    【解决方案2】:

    运行原生 Windows 客户端(例如 msysGit)可能比尝试在 Cygwin 中执行此操作更幸运。

    【讨论】:

    • 我对 Windows Git 客户端的体验通常是它们处理内存管理的情况更糟——我已经能够让 Cygwin Git 处理我尝试的 Windows Git 客户端所拒绝的约 15,000 次提交的 SVN 存储库在。不过,我想还是值得一试!
    • 喂!尽管我可能不喜欢正常使用 Windows Git 客户端,但它工作得很好。谢谢!
    【解决方案3】:

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

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

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

    【讨论】:

    • 没有core.deltaCacheSize。我怀疑你指的是pack.deltaCacheSize,我已经在调整它。不过,我现在会尝试其余的,谢谢!
    • @me_and:哎呀 - 我已经从我的答案中删除了那个
    • 不走运。我将使用我使用的新配置更新问题,但简短的版本是,您建议的更改似乎都不会对 git gc 尝试分配的内存量产生任何影响。
    【解决方案4】:

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

      [pack]
        packSizeLimit = 64m
        threads = 1
    

    .gitconfig
    

    最重要的是“threads = 1”

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 如果我今天一无所获,我今晚会用一个巨大的页面文件重新启动我的电脑,让它通宵运行……
      • 哦,我没有意识到你在 Windows 上——我认为添加交换文件是在 shell 中的几个命令的问题。好吧,我希望它仍然可以在 Windows 上使用,但你知道如何做到这一点;-)
      • 不走运。事实上,我增加了可用的页面文件空间,但 Windows 并没有决定使用它,这对我来说意味着可能存在一些 Cygwin 内存限制问题。我现在正在调查……
      • 也许cygwin 实现了ulimit? (我不知道)
      • 确实有类似的东西:有一个 Windows 注册表设置用于 Cygwin 的最大内存使用量。在我打字的同时进行更多的实验!
      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 2021-09-08
      • 2012-04-09
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多