Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.53.0 → 2.54.0 no changes
-
2.52.0
2025-11-17
- 2.49.1 → 2.51.2 no changes
-
2.49.0
2025-03-14
- 2.47.1 → 2.48.2 no changes
-
2.47.0
2024-10-06
- 2.43.1 → 2.46.4 no changes
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 no changes
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 no changes
-
2.41.0
2023-06-01
- 2.38.1 → 2.40.4 no changes
-
2.38.0
2022-10-02
- 2.37.1 → 2.37.7 no changes
-
2.37.0
2022-06-27
- 2.31.1 → 2.36.6 no changes
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 no changes
-
2.30.0
2020-12-27
- 2.24.1 → 2.29.3 no changes
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 no changes
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.13.7 → 2.17.6 no changes
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.10.5 no changes
-
2.9.5
2017-07-30
- 2.7.6 → 2.8.6 no changes
-
2.6.7
2017-05-05
- 2.5.6 no changes
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 no changes
-
2.0.5
2014-12-17
ОБЗОР
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
-
Принудительно запустить
gitgc, даже если в этом репозитории может работать другой экземплярgitgc. - --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 See original version for this content. |
ЗАМЕТКИ
git gc очень старается не удалять объекты, на которые есть ссылки где-либо в вашем репозитории. В частности, он сохраняет не только объекты, на которые ссылаются ваши текущие наборы веток и меток, но и объекты, на которые ссылаются индекс, отслеживаемые внешние ветки, журналы ссылок (reflogs) (которые могут ссылаться на коммиты в ветках, позже изменённых или перемотанных), а также всё остальное в пространстве имён refs/*. Обратите внимание, что заметка (того типа, который создаётся git notes), прикреплённая к объекту, не способствует сохранению объекта. Если вы ожидаете удаления некоторых объектов, а они не удаляются, проверьте все эти места и решите, имеет ли смысл в вашем случае удалить эти ссылки.
С другой стороны, когда git gc выполняется одновременно с другим процессом, существует риск удаления объекта, который другой процесс использует, но ещё не создал на него ссылку. Это может просто привести к сбою другого процесса или может повредить репозиторий, если другой процесс позже добавит ссылку на удалённый объект. Git имеет две функции, которые значительно смягчают эту проблему:
-
Любой объект с временем модификации новее даты
--pruneсохраняется вместе со всем, что из него достижимо. -
Большинство операций, которые добавляют объект в базу данных, обновляют время модификации объекта, если он уже присутствует, чтобы применялось правило №1.
Однако эти функции не обеспечивают полного решения, поэтому пользователи, которые выполняют команды одновременно, должны жить с некоторым риском повреждения (который на практике кажется низким).
ПЕРЕХВАТЧИКИ
Команда git gc --auto запустит перехватчик (hook) pre-auto-gc. Дополнительную информацию см. в githooks[5].
GIT
Является частью пакета git[1]