Короткая версия: это означает, что он говорит, и если вы просто дадите ему закончить, все будет хорошо.
Во время большинства операций, которые потенциально могут увеличить количество незакрепленных (распакованных) объектов в хранилище (включая push-сообщения), Git вызывает git gc --auto
. Если имеется достаточно незакрепленных объектов (по умолчанию не менее 6700), он будет вызывать их git repack -d -l
для упаковки. Если есть слишком много отдельных пакетов, он также упакует их в один.
Пакет представляет собой один файл с дельта-сжатием, содержащий большое количество объектов. Более эффективно хранить объекты в пакетах, но для упаковки (сжатия) объектов требуется время, поэтому Git сначала создает незакрепленные объекты, а затем упаковывает их в пакеты время от времени посредством автоматического вызова git gc --auto
.
Если вы позволите Git закончить переупаковку, это не повторится некоторое время. Это действительно может занять некоторое время, особенно если у вас много больших бинарных объектов, но если это срабатывает, то это признак того, что это, вероятно, значительно сократит объем дискового пространства, занимаемого репо. Если вы действительно не хотите, чтобы это произошло, вы можете изменить параметр config gc.auto
. Если вы увеличите его до чего-то намного большего, чем 6700, это будет происходить реже, но это займет больше времени. Если вы уменьшите его, вам все равно придется выполнить ваш текущий перепак, но впоследствии это произойдет чаще и закончится быстрее. Если вы установите его на 0, он отключит автоматическую перепаковку.
Смотрите man git-gc
(под --auto
) и man git-config
(под gc.auto
) для получения дополнительной информации.
fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack
- это то, что я получаю, вставляя всю нашу кодовую базу в одно git-репо. Думаю, я собираюсь убить приложения и принудительно перепаковать «вручную»Хотя Джефрони прав, что иногда для автоматической упаковки просто требуется время для завершения, если сообщение автоматической упаковки сохраняется в течение нескольких дней, как описано в OP, есть большая вероятность, что при очистке git отсутствуют висячие объекты, как описано в этом вопросе .
Чтобы увидеть, вызывают ли висящие объекты текущие сообщения об автоматической упаковке, попробуйте запустить
git fsck
. Если вы получили длинный список висячих коммитов, вы можете очистить ихgit gc --prune=now
Я обычно запускаю это на своем репо каждые 2-3 месяца, когда сообщение об автоматической упаковке не исчезает после одного нажатия.
источник
git pull
, в течение нескольких дней, иfsck
действительно демонстрировал тонну свисающих коммитов.Чтобы отключить для одного проекта:
Чтобы отключить глобально:
источник
Git запускает git-repack, который упаковывает множество объектов (= файлы, коммиты и деревья) в один файл пакета. Git делает это иногда, когда эвристик говорит, что может быть сэкономлено место (файл пакета содержит сжатые дельты объектов, в то время как каждый файл в каталоге objects / содержит сжатое полное содержимое файла)
источник
Надеюсь, этот
git gc --auto
шаг теперь (git 2.0.1, 25 июня 2014 г.) более эффективен.Смотрите коммит 62aad18 от Nguyễn Thái Ngọc Duy (
pclouds
)gc --auto
: не блокировать ссылки в фоновом режимеИ Git 2.22 (Q2 2019) дополнительно оптимизировать
git gc
.источник