Как избежать того, что "git gc" генерирует мусорные свободные объекты? - PullRequest
1 голос
/ 29 марта 2019

До того, как я запустил 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 почти не работает (и я не хочу это менять).

1 Ответ

2 голосов
/ 29 марта 2019

Если вы уверены, , что никакая другая команда 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 может удалить добавленные BLOB-объекты, которые еще не были зафиксированы, и, если у вас есть рабочее дерево с отключенным HEAD, даже некоторые коммиты. лучшее исправление для этого заключается в обновлении до 2.15.0 или более поздней версии, поскольку даже двухнедельного значения по умолчанию не обязательно достаточно.

...