Команда git gc
git gc
— это команда для технического обслуживания репозитория. gc расшифровывается как garbage collection, то есть «сбор мусора». Выполнение git gc
буквально указывает Git, чтобы пора прибраться и навести порядок в текущем репозитория. Концепция сбора мусора берет начало в интерпретируемых языках программирования с динамическим выделением памяти. В таких языках сбор мусора используется для поиска памяти, которая стала недоступной для исполняющей программы.
В репозиториях Git накапливаются различные виды мусора. Один из них — это коммиты без родителя или без возможности доступа. Коммиты в Git могут стать недоступными при выполнении команд изменения истории, например git reset
или git rebase
. Git стремится сохранить историю и избежать потери данных, поэтому не удаляет открепленные коммиты. На такие коммиты все еще можно переключиться, отобрать их командой cherry-pick и проверить через git log
.
Помимо очистки открепленных коммитов, git gc
также сжимает сохраненные объекты Git, освобождая ценное место на диске. Когда Git обнаруживает группу похожих объектов, они сжимаются в «пакет». Пакеты представляют собой что-то вроде ZIP-файлов объектов Git и лежат в каталоге ./git/objects/pack
в репозитории.
Так что же на самом деле делает git gc?
Перед выполнением команда git gc
проверяет ряд значений git config
. На примере этих значений становится понятно, за что еще отвечает git gc
.
Конфигурация git gc
gc.reflogExpire
Необязательная переменная, по умолчанию равная 90 дням. Она задает время, в течение которого хранятся записи в журнале ссылок ветки.
gc.reflogExpireUnreachable
Необязательная переменная, по умолчанию равная 30 дням. Она задает время, в течение которого хранятся недоступные записи в журнале ссылок ветки.
gc.aggressiveWindow
Необязательная переменная, по умолчанию равная 250. Она контролирует, сколько времени уходит на фазу разностного сжатия упаковки объектов при выполнении команды git gc
с параметром --aggressive
.
gc.aggressiveDepth
Необязательная переменная, по умолчанию равная 50. Она контролирует глубину сжатия, используемую git-repack
во время выполнения команды git gc --aggresive
.
gc.pruneExpire
Необязательная переменная, по умолчанию равная 2 неделям. Она задает, как долго недоступный объект хранится до его обрезки.
gc.worktreePruneExpire
Необязательная переменная, по умолчанию равная 3 месяцам. Она задает, как долго неактивное рабочее дерево хранится до его удаления.
Выполнение git gc
За кадром git gc
, по сути, выполняет последовательность других подкоманд, таких как git prune
, git repack
, git pack
и git rerere
. На высоком уровне эти команды отвечают за поиск объектов Git, которые выходят за пределы пороговых значений, установленных в конфигурации git gc
. После обнаружения эти объекты соответствующим образом сжимаются или обрезаются.
Рекомендации и часто задаваемые вопросы по git gc
Сбор мусора выполняется автоматически при вызове некоторых часто используемых команд:
Частота, с которой git gc
следует выполнять вручную, зависит от активности в репозитории. Для репозиториев с одним разработчиком запускать git gc
можно гораздо реже, чем для часто обновляемых многопользовательских репозиториев.
Сравнение git gc и git prune
git gc
— родительская команда, а git prune
— дочерняя. В процессе выполнения git gc
запускает git prune
. Команда git prune
используется для удаления объектов Git, которые считаются недоступными в соответствии с конфигурацией git gc
. Узнайте больше о git prune
.
За что отвечает параметр aggressive команды git gc?
git gc
можно вызвать с параметром --aggressive
. С опцией --aggressive
команда git gc
тратит больше времени на оптимизацию. При этом git gc
работает медленнее, но освобождает больше места на диске после завершения. Эффект --aggressive
сохраняется надолго, и команду нужно вызывать с этим параметром только после значительного количества изменений в репозитории.
За что отвечает параметр auto команды git gc?
Вариант команды git gc --auto
перед выполнением проверяет, нужно ли приводить репозиторий в порядок. Если оказывается, что очистка не нужна, команда завершается, не выполняя никакой работы. Некоторые команды Git автоматически запускают git gc --auto
после выполнения, чтобы очистить все созданные ими незакрепленные объекты.
Перед выполнением команда git gc --auto
проверяет конфигурацию Git
на наличие пороговых значений для свободных объектов и размера сжатия при упаковке. Эти значения можно задать с помощью git config
. Если у репозитория превышено любое из пороговых значений очистки, команда git gc --auto
продолжает работу.
Начало работы с git gc
Скорее всего, вы уже используете команду git gc
, даже о том не догадываясь. Как описано в разделе рекомендаций, она вызывается автоматически вместе с часто используемыми командами. Если вы хотите вызвать ее вручную, просто выполните команду git gc
, и увидите вывод, указывающий на проделанную ей работу.