Команда 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
Связанные материалы
Перемещение полного репозитория Git
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
Необязательная переменная, по умолчанию равная 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
, и увидите вывод, указывающий на проделанную ей работу.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.