让我先从一些背景开始:
我不得不将关键的Magento网上商店升级到新版本。为了确保所有现有代码在升级后仍能正常工作并进行一些升级后更改,我从整个Magento安装中创建了一个Git存储库(不包括明显的内容,如4.5GB的图像,。/ var目录等),推送它到源并在开发服务器上克隆它。做了一个新的分支,执行了升级,进行了代码更改,将它全部交给了dev分支并将其推回原点。
现在是升级'真正'商店的时候了,这意味着我必须将生产服务器上的主分支与dev分支合并。然后每次都错了:
git fetch
- 作品
git branch
说:* master
git merge origin/dev
非常错误(仅在等待一段时间后输出):
fatal: Out of memory? mmap failed: Cannot allocate memory
同样适用于git checkout dev
,git rebase master origin/dev
等。
这里有关于stackoverflow的现有问题的研究,并花了一个晚上尝试建议,包括(但不限于):
git gc
Counting objects: 48154, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (37152/37152), done.
fatal: Out of memory, malloc failed (tried to allocate 527338875 bytes)
error: failed to run repack
和
git repack -a -d --window-memory 10m --max-pack-size 20m
Counting objects: 48154, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (37152/37152), done.
fatal: Out of memory, malloc failed (tried to allocate 527338875 bytes)
除了上一个命令,我还尝试了this(非常相似)。 由于link提到了32位系统可能存在的问题,或许提及所涉及的三个系统的规范是明智的:
有谁知道如何从中恢复?重新包装原产地是否有效?如果是,我如何说服生产服务器获取存储库的新副本? 任何帮助将不胜感激!
答案 0 :(得分:14)
您获得的错误来自存储库中的大文件。 Git试图将文件的全部内容放在内存中,这使它变得cro。。
Git 1.7.6于上个月发布,在发行说明中有这个可爱的一点:
使用“git add”添加大于core.bigfilethreshold的文件(默认为1/2 Gig)将直接将内容发送到packfile,而不必同时在内存中保存它及其压缩表示。 / p>
升级到1.7.6可能会使您运行git gc
甚至可能git merge
,但我无法验证,因为很难获得进入该状态的存储库(条件必须恰到好处)
如果升级Git没有帮助,您可以尝试使用git filter-branch
从存储库中删除大文件。在此之前,请尝试使用git cat-file -p <commit_sha1>:path/to/large/file >/path/to/backup/of/large/file
备份大文件。
你会想要在你最强壮的机器(大量内存)上进行这些操作。
如果这样做,请尝试重新克隆到其他计算机(或只是rsync .git
目录)。
答案 1 :(得分:0)
当你在非空目录中执行“git init --bare”时,我看到了一些关于这种情况的报告。
您是否有机会使用非裸的“裸”/“服务器”存储库工作(也就是说,除了.git目录之外还有其他任何东西)?