Русский ▾ Topics ▾ Latest version ▾ git-gc last updated in 2.52.0

НАЗВАНИЕ

git-gc — Очистка ненужных файлов и оптимизация локального репозитория

ОБЗОР

git gc [--aggressive] [--auto] [--[no-]detach] [--quiet] [--prune=<дата> | --no-prune] [--force] [--keep-largest-pack]

ОПИСАНИЕ

Выполняет ряд задач по обслуживанию текущего репозитория, таких как сжатие редакций файлов (для уменьшения дискового пространства и повышения производительности), удаление недостижимых объектов, которые могли быть созданы при предыдущих вызовах git add, упаковка ссылок, подчистка (prune) журнала ссылок (reflog), метаданных rerere или устаревших рабочих каталогов. Также может обновлять вспомогательные индексы, такие как граф коммитов.

Когда выполняются распространённые высокоуровневые (porcelain) операции, создающие объекты, они проверяют, значительно ли вырос репозиторий с момента последнего обслуживания, и если да, то автоматически запускают git gc. См. gc.auto ниже, чтобы узнать, как отключить это поведение.

Запуск git gc вручную может потребоваться только при добавлении объектов в репозиторий без регулярного выполнения таких высокоуровневых команд, для выполнения разовой оптимизации репозитория или, например, для очистки неоптимального массового импорта. Дополнительные сведения о случае импорта см. в разделе «ОПТИМИЗАЦИЯ PACK-ФАЙЛА» в git-fast-import[1].

ПАРАМЕТРЫ

--aggressive

Обычно git gc выполняется очень быстро, обеспечивая хорошее использование дискового пространства и производительность. Этот параметр заставит git gc более агрессивно оптимизировать репозиторий за счёт значительного увеличения времени. Эффекты этой оптимизации в основном сохраняются. Подробности см. в разделе «AGGRESSIVE» ниже.

--auto

С этим параметром git gc проверяет, требуется ли какое-либо обслуживание; если нет, он завершает работу без выполнения каких-либо действий.

См. параметр gc.auto в разделе «КОНФИГУРАЦИЯ» ниже, чтобы узнать, как работает эта эвристика.

Как только обслуживание запускается из-за превышения ограничений параметров конфигурации, таких как gc.auto и gc.autoPackLimit, все остальные задачи обслуживания (например, rerere, рабочие каталоги, журнал ссылок…​) также будут выполнены.

--detach
--no-detach

Запускать в фоновом режиме, если система поддерживает это. Этот параметр переопределяет конфигурацию gc.autoDetach.

--cruft
--no-cruft

При устаревании недостижимых объектов упаковывать их отдельно в пакет cruft вместо хранения в виде непакованных (loose) объектов. --cruft включён по умолчанию.

--max-cruft-size=<n>

При упаковке недостижимых объектов в пакет cruft ограничить размер новых пакетов cruft не более чем <n> байт. Переопределяет любое значение, указанное в конфигурации gc.maxCruftSize. Подробнее см. параметр --max-cruft-size в git-repack[1].

--expire-to=<каталог>

При упаковке недостижимых объектов в пакет cruft записать пакет cruft, содержащий подчищенные (pruned) объекты (если таковые имеются), в каталог <dir>. Этот параметр действует только при совместном использовании с --cruft. Дополнительную информацию см. в параметре --expire-to в git-repack[1].

--prune=<date>

Подчистить (prune) непакованные (loose) объекты старше указанной даты (по умолчанию 2 недели назад, может быть переопределено переменной конфигурации gc.pruneExpire). --prune=now подчищает непакованные объекты независимо от их возраста и увеличивает риск повреждения, если другой процесс одновременно записывает в репозиторий; см. «ПРИМЕЧАНИЯ» ниже. --prune включён по умолчанию.

--no-prune

Не подчищать (prune) никакие непакованные (loose) объекты.

--quiet

Подавлять все отчёты о ходе выполнения.

--force

Принудительно запустить git gc, даже если в этом репозитории может работать другой экземпляр git gc.

--keep-largest-pack

Все пакеты, кроме самого большого пакета non-cruft, любых пакетов, помеченных файлом .keep, и любых пакетов cruft, объединяются в один пакет. При использовании этого параметра gc.bigPackThreshold игнорируется.

AGGRESSIVE

Когда указан параметр --aggressive, git-repack[1] будет вызван с флагом -f, который, в свою очередь, передаст --no-reuse-delta в git-pack-objects[1]. Это приведёт к отбрасыванию всех существующих дельт и их повторному вычислению, что потребует гораздо больше времени на переупаковку.

Эффекты этого в основном сохраняются, например, когда пакеты и непакованные (loose) объекты объединяются в другой пакет, существующие дельты в этом пакете могут быть повторно использованы, но также существуют различные случаи, когда мы можем выбрать неоптимальную дельту из более нового пакета.

Кроме того, указание --aggressive изменяет параметры --depth и --window, передаваемые в git-repack[1]. См. настройки gc.aggressiveDepth и gc.aggressiveWindow ниже. Используя больший размер окна, мы с большей вероятностью найдём более оптимальные дельты.

Вероятно, не стоит использовать этот параметр для данного репозитория без проведения специализированных тестов производительности на нём. Это требует гораздо больше времени, и результирующая оптимизация пространства/дельты может того стоить, а может и нет. Для большинства пользователей и их репозиториев правильным компромиссом является полный отказ от его использования.

КОНФИГУРАЦИЯ

Дальнейшее содержание этого раздела, повторяет то, что может быть найдено в git-config[1]:

Warning

Missing ru/config/gc.adoc

See original version for this content.

ЗАМЕТКИ

git gc очень старается не удалять объекты, на которые есть ссылки где-либо в вашем репозитории. В частности, он сохраняет не только объекты, на которые ссылаются ваши текущие наборы веток и меток, но и объекты, на которые ссылаются индекс, отслеживаемые внешние ветки, журналы ссылок (reflogs) (которые могут ссылаться на коммиты в ветках, позже изменённых или перемотанных), а также всё остальное в пространстве имён refs/*. Обратите внимание, что заметка (того типа, который создаётся git notes), прикреплённая к объекту, не способствует сохранению объекта. Если вы ожидаете удаления некоторых объектов, а они не удаляются, проверьте все эти места и решите, имеет ли смысл в вашем случае удалить эти ссылки.

С другой стороны, когда git gc выполняется одновременно с другим процессом, существует риск удаления объекта, который другой процесс использует, но ещё не создал на него ссылку. Это может просто привести к сбою другого процесса или может повредить репозиторий, если другой процесс позже добавит ссылку на удалённый объект. Git имеет две функции, которые значительно смягчают эту проблему:

  1. Любой объект с временем модификации новее даты --prune сохраняется вместе со всем, что из него достижимо.

  2. Большинство операций, которые добавляют объект в базу данных, обновляют время модификации объекта, если он уже присутствует, чтобы применялось правило №1.

Однако эти функции не обеспечивают полного решения, поэтому пользователи, которые выполняют команды одновременно, должны жить с некоторым риском повреждения (который на практике кажется низким).

ПЕРЕХВАТЧИКИ

Команда git gc --auto запустит перехватчик (hook) pre-auto-gc. Дополнительную информацию см. в githooks[5].

GIT

Является частью пакета git[1]