Spec-Zone.ru › Git

git-gc

Название

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

Краткое описание

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

Описание

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

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

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

Параметры

--aggressive

Обычно git gc выполняется очень быстро, обеспечивая при этом эффективное использование дискового пространства и высокую производительность. Этот параметр заставляет git gc более агрессивно оптимизировать репозиторий, затрачивая на это значительно больше времени. Результаты такой оптимизации в основном сохраняются. Подробности см. ниже в разделе «АГРЕССИВНАЯ ОПТИМИЗАЦИЯ».

--auto

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

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

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

--detach
--no-detach

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

--cruft
--no-cruft

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

--max-cruft-size=<n>

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

--expire-to=<dir>

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

--prune=<date>

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

--no-prune

Не удалять отдельные объекты.

--quiet

Не выводить сообщения о ходе выполнения.

--force

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

--keep-largest-pack

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

Агрессивная оптимизация

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

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

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

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

Конфигурация

Всё содержимое этого раздела ниже данной строки выборочно включено из документации git-config[1]. Оно совпадает с содержимым оригинала:

gc.aggressiveDepth

Параметр глубины, используемый алгоритмом дельта-сжатия команды git gc --aggressive. Значение по умолчанию — 50; оно используется для параметра --depth, если не задействован параметр --aggressive.

Дополнительные сведения см. в документации к параметру --depth команды git-repack[1].

gc.aggressiveWindow

Параметр размера окна, используемый алгоритмом дельта-сжатия команды git gc --aggressive. Значение по умолчанию — 250, что значительно превышает стандартный размер окна --window, равный 10.

Дополнительные сведения см. в документации к параметру --window команды git-repack[1].

gc.auto

Если количество отдельных объектов в репозитории превышает примерно это значение, команда git gc --auto упакует их. Некоторые высокоуровневые команды время от времени используют эту команду для упрощённой сборки мусора. Значение по умолчанию — 6700.

Значение 0 отключает не только автоматическую упаковку на основе количества отдельных объектов, но и любые другие эвристики, которые git gc --auto использует для определения необходимости выполнения работ, например gc.autoPackLimit.

gc.autoPackLimit

Если количество пакетов в репозитории, не помеченных файлом *.keep, превышает это значение, команда git gc --auto объединит их в один пакет большего размера. Значение по умолчанию — 50. Значение 0 отключает эту функцию. Установка для gc.auto значения 0 также отключает её.

См. приведённую ниже переменную конфигурации gc.bigPackThreshold. При её использовании изменяется принцип работы автоматического ограничения числа пакетов.

gc.autoDetach

Заставляет git gc --auto немедленно завершиться и продолжить работу в фоновом режиме, если это поддерживается системой. По умолчанию — true. Эта переменная конфигурации используется как резервная настройка, если maintenance.autoDetach не задана.

gc.bigPackThreshold

Если значение не равно нулю, при запуске git gc сохраняются все пакеты, не являющиеся cruft-пакетами, размер которых превышает этот порог. Это очень похоже на --keep-largest-pack, но сохраняются все пакеты, не являющиеся cruft-пакетами, которые соответствуют порогу, а не только самый большой пакет. По умолчанию равно нулю. Поддерживаются распространённые суффиксы единиц измерения k, m и g.

Обратите внимание: если количество сохраняемых пакетов превышает gc.autoPackLimit, эта переменная конфигурации игнорируется и все пакеты, кроме базового, переупаковываются. После этого количество пакетов должно стать меньше gc.autoPackLimit, и gc.bigPackThreshold снова будет учитываться.

Если для бесперебойной работы git repack недостаточно оперативной памяти и параметр gc.bigPackThreshold не задан, самый большой пакет также не будет сохранён (это эквивалентно запуску git gc с параметром --keep-largest-pack).

gc.writeCommitGraph

Если значение равно true, при запуске git-gc[1] команда gc перезаписывает файл графа коммитов. При использовании git gc --auto граф коммитов обновляется, если требуется обслуживание. По умолчанию — true. Подробности см. в git-commit-graph[1].

gc.logExpiry

Если файл gc.log существует, команда git gc --auto выводит его содержимое и завершается с нулевым кодом, не запускаясь, если только этому файлу не больше gc.logExpiry. Значение по умолчанию — "1.day". Дополнительные способы указать значение см. в разделе gc.pruneExpire.

gc.packRefs

Запуск git pack-refs в репозитории делает его недоступным для клонирования версиями Git до 1.5.1.2 через простые транспортные протоколы, например HTTP. Эта переменная определяет, запускает ли git gc команду git pack-refs. Для включения этой функции во всех непустых репозиториях можно задать значение notbare либо указать логическое значение. По умолчанию — true.

gc.cruftPacks

Хранить недостижимые объекты в cruft-пакете (см. git-repack[1]), а не в виде отдельных объектов. По умолчанию — true.

gc.maxCruftSize

Ограничивать размер новых cruft-пакетов при переупаковке. Если задан параметр --max-cruft-size, приоритет имеет параметр командной строки. См. описание параметра --max-cruft-size команды git-repack[1].

gc.pruneExpire

При запуске git gc команда вызывает prune --expire 2.weeks.ago (а при использовании cruft-пакетов через gc.cruftPacks или --cruft — также repack --cruft --cruft-expiration 2.weeks.ago). Эту переменную конфигурации можно использовать для переопределения льготного периода. Значение "now" отключает льготный период и немедленно удаляет недостижимые объекты, а значение "never" запрещает удаление. Эта возможность помогает предотвратить повреждение данных, если git gc выполняется одновременно с другим процессом, записывающим данные в репозиторий; см. раздел «ПРИМЕЧАНИЯ» в git-gc[1].

gc.worktreePruneExpire

При запуске git gc вызывает git worktree prune --expire 3.months.ago. Эту переменную конфигурации можно использовать, чтобы задать другой льготный период. Значение "now" отключает льготный период и немедленно удаляет $GIT_DIR/worktrees, а значение "never" запрещает удаление.

gc.reflogExpire
gc.<pattern>.reflogExpire

Команда git reflog expire удаляет записи reflog, срок хранения которых превышает это значение; по умолчанию — 90 дней. Значение "now" немедленно удаляет все записи, а значение "never" полностью запрещает их удаление. Если в середине указано "<pattern>" (например, "refs/stash"), настройка применяется только к ссылкам, соответствующим шаблону <pattern>.

gc.reflogExpireUnreachable
gc.<pattern>.reflogExpireUnreachable

Команда git reflog expire удаляет записи reflog, срок хранения которых превышает это значение и которые недостижимы из текущей вершины; по умолчанию — 30 дней. Значение "now" немедленно удаляет все записи, а значение "never" полностью запрещает их удаление. Если в середине указано "<pattern>" (например, "refs/stash"), настройка применяется только к ссылкам, соответствующим шаблону <pattern>.

Такие записи обычно создаются в результате использования команд git commit --amend или git rebase и относятся к коммитам, существовавшим до выполнения amend или rebase. Поскольку эти изменения не входят в текущий проект, большинство пользователей предпочитает удалять их раньше, поэтому значение по умолчанию более агрессивно, чем gc.reflogExpire.

gc.recentObjectsHook

При определении, удалять ли объект (при создании cruft-пакета или сохранении недостижимых объектов в виде отдельных), выполняет в командной оболочке указанную команду или команды. Вывод интерпретируется как идентификаторы объектов, которые Git будет считать «недавно созданными» независимо от их возраста. Считая время изменения этих объектов равным «сейчас», Git сохранит все упомянутые в выводе объекты и их потомков независимо от их фактического возраста.

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

gc.repackFilter

При переупаковке использовать указанный фильтр, чтобы переместить определённые объекты в отдельный файл пакета. См. описание параметра --filter=<filter-spec> команды git-repack[1].

gc.repackFilterTo

При переупаковке с использованием фильтра см. gc.repackFilter: указанный путь будет использоваться для создания файла пакета с отфильтрованными объектами. ПРЕДУПРЕЖДЕНИЕ: указанный путь должен быть доступен, например, с помощью механизма alternates в Git; в противном случае Git может считать репозиторий повреждённым, поскольку у него может не быть доступа к объектам в этом файле пакета. См. описание параметра --filter-to=<dir> команды git-repack[1] и раздел objects/info/alternates в gitrepository-layout[5].

gc.rerereResolved

Записи о конфликтах при слиянии, которые были разрешены ранее, сохраняются в течение указанного количества дней при запуске git rerere gc. Можно также использовать более понятные значения, например "1.month.ago". Значение по умолчанию — 60 дней. См. git-rerere[1].

gc.rerereUnresolved

Записи о конфликтах при слиянии, которые не были разрешены, сохраняются в течение указанного количества дней при запуске git rerere gc. Можно также использовать более понятные значения, например "1.month.ago". Значение по умолчанию — 15 дней. См. git-rerere[1].

Примечания

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

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

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

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

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

Хуки

Команда git gc --auto запускает хук pre-auto-gc. Дополнительные сведения см. в githooks[5].

См. также

git-prune[1] git-reflog[1] git-repack[1] git-rerere[1]

gc

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-gc

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API