Как я могу оправиться от " 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 в нем)?