Как я могу оправиться от " fatal: Out of memory? ошибка mmap: не удается выделить память " в Git?

позвольте мне начать с некоторого контекста:

мне пришлось обновить важный интернет-магазин Magento до новой версии. Чтобы убедиться, что весь существующий код будет работать после обновления и внести некоторые изменения после обновления, я сделал репозиторий Git из всей установки Magento (исключая очевидный контент, такой как 4.5 GB изображений,./ var directory etc.), подтолкнул его к источнику и клонировал его на dev-сервере. Сделал новую ветку, выполнил обновления, внес изменения в код, зафиксировал все это в Дев ветвь и толкнул его обратно в origin.

теперь пришло время обновить "реальный" магазин, то есть я должен объединить главную ветку на производственном сервере с веткой 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 etc.

сделал несколько исследование здесь на 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)

в дополнение к предыдущей команде, я тоже пробовал этой (который очень похож). Как ссылке упоминает о возможной проблеме с 32-битными системами, возможно, разумно упомянуть спецификации для трех задействованных систем:

  • 'dev' сервер: x86_64 Gentoo 2.6.38-закаленный-R6 / / 4 ядра и 8 ГБ оперативной памяти
  • сервер "origin": x86_64 Gentoo 2.6.38-закаленный-R6 / / 2 ядра и 4 ГБ оперативной памяти
  • 'live' сервер: x86_64 Debian 4.3.2-1.1 2.6.35.5-pv1amd64 / / (VPS) 2 ядра и 3 ГБ оперативной памяти

кто-нибудь знает как я могу оправиться от этого? Работает ли переупаковка в origin? Если да, то как я могу убедить производственный сервер получить новую копию репозитория? Любая помощь будет очень признательна!

2 ответов


ошибка, которую вы получаете, происходит из больших файлов в вашем репозитории. Git пытается поместить все содержимое файла в память, что заставляет его квакать.

Попробуйте Обновить Git

Git 1.7.6 был выпущен в прошлом месяце и имеет этот прекрасный бит в примечаниях к выпуску:

добавление файла больше, чем core.bigfilethreshold (по умолчанию 1/2 Gig) с помощью "git add" отправит содержимое прямо в packfile без необходимости удерживать его и его сжатое представление одновременно в памяти.

обновление до 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 init-bare" в непустом каталоге.

вы случайно работаете в/с"голым" / "серверным" репозиторием, который не пуст (то есть имеет что-то еще, кроме .каталог Git в нем)?