Close

Команда 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

Логотип Bitbucket
СМ. РЕШЕНИЕ

Изучите 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.

Люди сотрудничают друг с другом, используя стену со множеством инструментов

Блог Bitbucket

Рисунок: DevOps

Образовательные программы DevOps

Демонстрация функций в демо-зале с участием экспертов Atlassian

Как инструмент Bitbucket Cloud работает с Atlassian Open DevOps

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up