До того, как я побежал git gc
, у меня было несколько тысяч незакрепленных предметов:
$ git count-objects -v
count: 3706
size: 17164
in-pack: 147149
packs: 9
size-pack: 46619
prune-packable: 0
garbage: 0
size-garbage: 0
(обратите внимание на незакрепленный предмет count
и size
). После git gc
у меня было больше:
$ git count-objects -v
count: 6735
size: 19687
in-pack: 142215
packs: 1
size-pack: 43373
prune-packable: 0
garbage: 0
size-garbage: 0
Я знаю, что это происходит потому, что git gc
выселяет объекты из пакетов, когда они становятся недоступными; это дает им новую «аренду жизни» в качестве незакрепленных объектов.
Как я могу избежать этого единственного поведения git gc
? Я хочу, чтобы все остальные его поведения остались, т. е. все тайм-ауты, всякие удаления мусора, все, кроме этого.
Я бегаю git gc
максимум раз в месяц. По какой-то причине, которую я не знаю, git gc --auto
почти никогда не запускается (и я не хочу это менять).
Если вы Конечно, никакая другая команда Git не выполняется в этом репозитории в то время, когда вы запускаете git gc
в этом репозитории, вы можете добавить --prune=all
. По умолчанию используется --prune=2.weeks.ago
, что дает другим запущенным командам 14 дней для завершения своей работы; например, вы можете использовать --prune=1.day.ago
, чтобы дать им меньше времени.
Вы также можете настроить gc.pruneExpire
: если он не установлен, по умолчанию используется 2.weeks.ago
, что приводит к указанному выше значению по умолчанию. Как заметки j6t, вариант настройки gc.pruneExpire
это now
, а не all
. Однако неразумно устанавливать здесь now
: автоматический git gc
будет использовать это значение. а также будет работать в фоновом режиме, в то время как другие операции Git выполняются.
Обратите внимание, что если у вас есть версия Git >= 2.5, но ниже 2.15.0, уменьшенный gc.pruneExpire
может сломать ваши добавленные рабочие деревья за меньшее время, чем две недели по умолчанию. Ошибка заключается в том, что git gc
не может использовать HEAD
и индекс добавленного рабочего дерева в качестве отправной точки для обхода достижимости объекта DAG. В результате git gc
может удалить добавленные большие двоичные объекты, которые еще не были зафиксированы, и, если у вас есть рабочее дерево с отсоединенным HEAD, даже некоторые фиксации. Исправление Лучший для этого заключается в обновлении до 2.15.0 или более поздней версии, поскольку даже двухнедельного срока по умолчанию недостаточно.
Слово предупреждение читателям, наткнувшимся на этот пост: если вы используете git worktree
и Git до версии 2.15.0, git gc
может сломать ваши вторичные рабочие деревья с настройкой gc.pruneExpire
или без нее. Но установка на now
делает много проще выстрелить себе в ногу!
Интересно. Я собирался использовать now
, но в документации сказано использовать all
(!). Это может быть связано с тем, что установка pruneExpire
на now
неразумна (см. редактирование). И да, сборка мусора с добавленными рабочими деревьями прерывается в версиях с 2.5 по (но не включая) 2.15.0; Я сам столкнулся с этим.
pruneExpire
указывает время. Был обсуждение недавно, что документация по крайней мере неточна, когда она говорит all
. Это действительно должно быть now
.
Спасибо, это все. Я установил
gc.pruneExpire
наnow
, посколькуall
— это просто неразборчивая дата, которая интерпретируется какnow
(и это может измениться в будущей версии Git).