Подтвердить что ты не робот

Как я могу оправиться от "фатального: из памяти? Mmap не удалось: не удалось выделить память" в Git?

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

Мне пришлось обновить ключевой веб-магазин Magento до новой версии. Чтобы убедиться, что весь существующий код по-прежнему будет работать после обновления и внесет некоторые изменения после обновления, я сделал репозиторий Git со всей установки Magento (за исключением очевидного контента, такого как 4,5 ГБ изображений, каталог. /var и т.д.), подтолкнули его к происхождению и клонировали его на dev-сервере. Создал новую ветку, выполнял обновления, делал изменения кода, передавал все это ветки 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)

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

  • 'dev' сервер: x86_64 Gentoo 2.6.38-hardened-r6//4 ядра и 8 ГБ ОЗУ
  • 'origin' server: x86_64 Gentoo 2.6.38-hardened-r6//2 ядра и 4 ГБ ОЗУ
  • 'live' server: x86_64 Debian 4.3.2-1.1 2.6.35.5-pv1amd64//(VPS) 2 ядра и 3 ГБ оперативной памяти

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

4b9b3361

Ответ 1

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

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

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

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

Обновление до 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).

Ответ 2

Я видел несколько сообщений об этом, когда вы делаете "git init --bare" в непустой директории.

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