Git GC использует слишком много памяти, не может завершить
Окончательное обновление и исправление: решение оказалось сочетанием двух вещей: использование Windows Git, а не Cygwin Git, как предложил Graham Borland, и настройки конфигурации Git pack.threads = 1
а также gc.aggressiveWindow = 150
,
У меня есть большой локальный репозиторий Git, git svn clone
репозитория SVN с около 40000 коммитов. Я пытаюсь бежать git gc
через этот репозиторий и никуда не денемся
$ git gc --auto
Auto packing the repository for optimum performance. You may also
run "git gc" manually. See "git help gc" for more information.
Counting objects: 25966, done.
Compressing objects: 100% (25249/25249), done.
fatal: Out of memory, malloc failed (tried to allocate 426523986 bytes)
error: failed to run repack
Я запускаю Git 1.7.5.1 внутри Cygwin на 64-битной двухъядерной машине Win7 с 4 ГБ ОЗУ. .git
каталог в настоящее время чуть более 6,1 ГБ.
Я пробовал бегать git gc --aggressive
, чтобы увидеть, если более полная система способна это исправить, но не повезло: я получаю сообщение, подобное вышеупомянутому, с таким же размером попытки malloc
, но значительно более высокое число объектов (508 485, 493 506 сжатых).
Я также попробовал - как подсказал Google - разбирал твиды [pack]
часть моей .gitconfig
файл; наиболее полное из другого вопроса Stackru. мой .gitconfig
теперь имеет следующие соответствующие строки, но их установка, кажется, не имеет никакого значения:
[pack]
windowMemory = 16m
threads = 1
window = 1
depth = 1
deltaCacheSize = 1
Любые предложения о том, как я могу получить git
в gc
мой репозиторий?
Изменить: Mark Longair предложил еще немного .gitconfig
изменения файла Что я сделал, новые строки ниже. Но изменения не имели никакого значения вообще.
[core]
packedGitWindowSize = 1m
packedGitLimit = 256m
[pack]
packSizeLimit = 128m
Редактировать 2: Michael Krelin - hacker предложил увеличить размер файла подкачки / страницы (инструкции WinXP здесь, и это похоже на Win7). Я попробовал это, но это не имело никакого значения, и действительно, я только увеличил максимальный доступный размер, и похоже, что Windows никогда не пыталась увеличить размер используемого файла подкачки.
Сейчас я смотрю, было ли это вызвано ограничением памяти внутри или наложено на Cygwin. Чтобы проверить "наложено", я пытаюсь запустить Cygwin с правами администратора. Чтобы проверить "в пределах" (который выглядит более вероятным), у меня есть игра с максимальными настройками памяти Cygwin.
Редактировать 3: Хотя я предпочитаю использовать Cygwin, оказывается, что клиент Windows Git прекрасно справляется с проблемой памяти. Кажется, я буду возвращаться к этому время от времени, когда мой репозиторий нуждается в аккуратности.
5 ответов
Возможно, вам больше повезет, если вы запустите собственный клиент Windows, такой как msysGit, вместо того, чтобы пытаться сделать это внутри Cygwin.
У меня была такая же проблема, безуспешно пробовал упомянутые решения. Но мои проблемы с git gc начались после того, как я добавил в репозиторий большие файлы изображений, поэтому я создал файл.gitattributes и отключил дельта-сжатие для этих больших файлов:
*.tga -delta
*.psd -delta
Это сработало.
Некоторые другие параметры конфигурации, которые вы можете попробовать ограничить значениями ниже стандартных, включают:
pack.packSizeLimit
core.packedGitWindowSize
core.packedGitLimit
... все из которых описаны в git config
документация В каждом конкретном случае особенно стоит проверять, что понимают юниты, с которыми я ошибался в прошлом.
Единственное, что помогло избежать этой ошибки на общем хостинге Linux, это добавить
[pack]
packSizeLimit = 64m
threads = 1
в
.gitconfig
Наиболее важным было "threads = 1"
Может быть, поможет временное добавление файла подкачки, большего, чем life, и покупка нескольких чашек кофе в другом месте?