【问题标题】:Git push - suboptimal pack - out of memoryGit push - 次优包 - 内存不足
【发布时间】:2012-03-22 15:22:46
【问题描述】:

我真的可以在这里得到一些帮助。

我刚刚创建了一个新的裸仓库作为开发推送的生产目标。 我还在服务器上将工作 Web 目录作为 git 存储库。 服务器在centos5.5上运行git 1.7.4.1

在 web 目录中创建新的 repo 后,我执行了 git add 。 它统计了 2300 个和一些奇怪的文件以及超过 230k 的插入。

我提交了新添加的文件库。很好很干净。 但是,当我执行 git push origin master 时,它一直给我这个(请注意,我有 8 个 CPU,因此有 8 个线程。文档说这是正常的);

# git push --mirror
Counting objects: 2000, done.
Delta compression using up to 8 threads.
warning: suboptimal pack - out of memory
fatal: inflateInit: out of memory (no message)
error: failed to push some refs to '/home/ggadmin/gg-prod.git'

我尝试了以下方法来解决这个问题,但都产生了相同的结果;

git repack -adf --window-memory=100m
                                ^ tried running this up to 1024m. Same result.

甚至尝试了强制推送,但得到了同样的结果,只是出现了 malloc 错误;

# git push -f origin master
Counting objects: 2000, done.
Delta compression using up to 8 threads.
warning: suboptimal pack - out of memory
fatal: Out of memory, malloc failed (tried to allocate 2340 bytes)
error: failed to push some refs to '/home/ggadmin/gg-prod.git'

我已经为此工作了 2 天,并尝试了几乎所有可以在 google 和 SO 上找到的东西。

试图解决这个问题,我已经束手无策了。请告诉我那里有人知道可以做些什么来完成这项工作?

【问题讨论】:

  • 可以肯定的是,这与postBuffer 无关? stackoverflow.com/questions/6842687/…
  • 请解释一下你的意思,VonC,因为这对我来说是一个关于 Git 的新术语。
  • 我想知道git config --global http.postBuffer 524288000 是否无法让您的推送工作。
  • 我当然可以试试。我现在在我的办公室,所以我必须等到我回家看看这是否有效。谢谢,VonC! :)

标签: git memory git-push


【解决方案1】:

就我而言,我之前已将服务器的虚拟内存减少到零,以便删除分页文件,以便释放分区并增加主分区的大小。这有减少我的工作记忆的效果,结果是 git 无法处理大文件。再次增加我的虚拟内存后,一切都已排序。

【讨论】:

    【解决方案2】:

    这些答案都没有帮助我。我的问题是我的小服务器有 1gb 的 RAM 并且没有 SWAP。我让sudo service apache2 stopsudo service mysql stop + 从htop 杀死了一个未使用的进程(毕竟我得到了~100mb 的RAM)和git push 正确。

    【讨论】:

      【解决方案3】:

      以下命令为我解决了这个问题:

      git config --global pack.windowMemory 256m
      

      这会影响 delta 压缩的效果,因此您可能需要先尝试更大的尺寸,例如 1g,具体取决于您的硬件和带宽。

      更多详情:https://www.kernel.org/pub/software/scm/git/docs/git-pack-objects.html

      【讨论】:

        【解决方案4】:

        我意识到这在游戏中有点晚了,但由于上面的一些内容帮助了我(感谢@Ashitakalax),这是我的两分钱。 将更改从 Wordpress 开发实例上游移动到测试时,与上述相同的问题(inflateInit:内存不足),git 因内存不足而中止,这通常是由于保存图像文件的 ../uploads/ 目录的更改。所有这些都在一个无法访问全局 git 配置的共享主机中,所以我们这样做:

        0- in repo: git commit -m "some relevant details"
        

        记录变化

        1- rsync -av --progress repo/wp-content/uploads/ test/wp-content/uploads
        

        移动大部分图像修复/更改

        2- in test: git add -A
        

        在事物的测试方面跟踪新的东西

        3- in test: git fetch origin
        

        现在从 repo 中获取其余部分

        4- in test: git merge origin/master
        

        最后合并...

        rsync 位减轻了 git 负载,一切都很好。

        【讨论】:

          【解决方案5】:
          git config --global pack.threads 1
          

          【讨论】:

          • 这是唯一对我有用的东西。呃,我讨厌仍然不得不处理旧的共享服务器。
          【解决方案6】:

          我在使用 git clone 时遇到了同样的问题。回购是 25GB。我使用了一个替代命令,对我来说它需要对源代码的根控制,

          rsync -avz -e ssh --progress user@computerName:repo/Directory destination/folder
          

          在此之后,我能够像任何其他存储库一样提交和拉取。

          【讨论】:

            【解决方案7】:
            1. 可能 git 不是处理大量大 blob 的次优工具。
            2. 您可以禁用多线程压缩以节省内存:git config pack.threads 1(除了其他内存限制选项,如较新 Git 中的core.bigfilethreshold

            【讨论】:

            • 嗯,Vi...git 的运行速度比在北极夏天顺着管道流下的糖蜜要慢,但它确实奏效了。谢谢!
            • 你可以考虑从 git repo 外部化大东西(同时仍然对它们进行版本控制),或者使用其他一些方法来完成任务。 Git 可能正试图在您的所有数据中找到类似的块。尝试调整core.bigfilethreshold 选项(git >= v1.7.6)
            • 再次感谢 Vi!不幸的是,我使用的是 v1.7.4.1。但我会把它放在我的 Git 知识项目的顶部。
            猜你喜欢
            • 2012-02-09
            • 1970-01-01
            • 2016-05-21
            • 2016-03-25
            • 2017-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-20
            相关资源
            最近更新 更多