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
-
Принудительно запустить
gitgc, даже если в этом репозитории может выполняться другой экземплярgitgc. - --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
-
Если количество отдельных объектов в репозитории превышает примерно это значение, команда
gitgc--autoупакует их. Некоторые высокоуровневые команды время от времени используют эту команду для упрощённой сборки мусора. Значение по умолчанию — 6700.Значение 0 отключает не только автоматическую упаковку на основе количества отдельных объектов, но и любые другие эвристики, которые
gitgc--autoиспользует для определения необходимости выполнения работ, напримерgc.autoPackLimit. - gc.autoPackLimit
-
Если количество пакетов в репозитории, не помеченных файлом
*.keep, превышает это значение, командаgitgc--autoобъединит их в один пакет большего размера. Значение по умолчанию — 50. Значение 0 отключает эту функцию. Установка дляgc.autoзначения 0 также отключает её.См. приведённую ниже переменную конфигурации
gc.bigPackThreshold. При её использовании изменяется принцип работы автоматического ограничения числа пакетов. - gc.autoDetach
-
Заставляет
gitgc--autoнемедленно завершиться и продолжить работу в фоновом режиме, если это поддерживается системой. По умолчанию — true. Эта переменная конфигурации используется как резервная настройка, еслиmaintenance.autoDetachне задана. - gc.bigPackThreshold
-
Если значение не равно нулю, при запуске
gitgcсохраняются все пакеты, не являющиеся cruft-пакетами, размер которых превышает этот порог. Это очень похоже на--keep-largest-pack, но сохраняются все пакеты, не являющиеся cruft-пакетами, которые соответствуют порогу, а не только самый большой пакет. По умолчанию равно нулю. Поддерживаются распространённые суффиксы единиц измеренияk,mиg.Обратите внимание: если количество сохраняемых пакетов превышает gc.autoPackLimit, эта переменная конфигурации игнорируется и все пакеты, кроме базового, переупаковываются. После этого количество пакетов должно стать меньше gc.autoPackLimit, и gc.bigPackThreshold снова будет учитываться.
Если для бесперебойной работы
gitrepackнедостаточно оперативной памяти и параметрgc.bigPackThresholdне задан, самый большой пакет также не будет сохранён (это эквивалентно запускуgitgcс параметром--keep-largest-pack). - gc.writeCommitGraph
-
Если значение равно true, при запуске git-gc[1] команда gc перезаписывает файл графа коммитов. При использовании
gitgc--autoграф коммитов обновляется, если требуется обслуживание. По умолчанию — true. Подробности см. в git-commit-graph[1]. - gc.logExpiry
-
Если файл gc.log существует, команда
gitgc--autoвыводит его содержимое и завершается с нулевым кодом, не запускаясь, если только этому файлу не большеgc.logExpiry. Значение по умолчанию — "1.day". Дополнительные способы указать значение см. в разделеgc.pruneExpire. - gc.packRefs
-
Запуск
gitpack-refsв репозитории делает его недоступным для клонирования версиями Git до 1.5.1.2 через простые транспортные протоколы, например HTTP. Эта переменная определяет, запускает лиgit gcкомандуgitpack-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>.Такие записи обычно создаются в результате использования команд
gitcommit--amendилиgitrebaseи относятся к коммитам, существовавшим до выполнения 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 есть две возможности, существенно уменьшающие этот риск:
-
Любой объект, время изменения которого новее даты
--prune, сохраняется вместе со всем, что от него достижимо. -
Большинство операций, добавляющих объект в базу данных, обновляют время изменения объекта, если он уже существует, благодаря чему применяется правило № 1.
Однако эти меры не обеспечивают полного решения проблемы, поэтому пользователям, запускающим команды одновременно, приходится мириться с некоторым риском повреждения данных (на практике он, по-видимому, невелик).
Хуки
Команда git gc --auto запускает хук pre-auto-gc. Дополнительные сведения см. в githooks[5].
См. также
gc
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-gc