git-repack
Название
git-repack — упаковка распакованных объектов в репозитории
Краткое описание
git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]
[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]
[--write-midx[=<mode>]] [--name-hash-version=<n>] [--path-walk] Описание
Эта команда используется для упаковки всех объектов, которые в данный момент не находятся в «пакете». Её также можно использовать для реорганизации существующих пакетов в один более эффективный пакет.
Пакет — это коллекция объектов, каждый из которых сжат отдельно и к которым применяется дельта-сжатие. Они хранятся в одном файле с соответствующим индексным файлом.
Пакеты используются для снижения нагрузки на зеркальные системы, системы резервного копирования, дисковое хранилище и т. д.
Параметры
- -a
-
Вместо инкрементальной упаковки распакованных объектов упаковать в один пакет все объекты, на которые есть ссылки. Особенно полезно при упаковке репозитория, используемого для частной разработки. Используйте вместе с
-d. Это очистит объекты, оставленные командойgitprune, но показываемые командойgitfsck--full--danglingкак недостижимые.Обратите внимание: пользователям, получающим данные через простые протоколы, придётся загрузить весь новый пакет, чтобы получить любой содержащийся в нём объект, независимо от того, сколько других объектов из этого пакета уже есть у них локально.
Файлы пакетов promisor перепаковываются отдельно: если у файлов пакетов есть соответствующий файл «.promisor», эти файлы пакетов будут перепакованы в другой отдельный пакет, а для нового отдельного пакета будет создан пустой файл «.promisor».
- -A
-
То же, что и
-a, если не используется-d. В этом случае все недостижимые объекты из предыдущего пакета становятся отдельными распакованными объектами, а не остаются в старом пакете. Недостижимые объекты никогда намеренно не добавляются в пакет, даже при перепаковке. Этот параметр предотвращает немедленное удаление недостижимых объектов: они остаются в старом пакете, который затем удаляется. Вместо этого отдельные недостижимые объекты будут удалены согласно обычным правилам срока хранения при следующем вызовеgit gc. См. git-gc[1]. - -d
-
После упаковки удалить избыточные пакеты, если вновь созданные пакеты делают некоторые существующие пакеты избыточными. Также запустить
git prune-packedдля удаления избыточных файлов отдельных объектов. - --cruft
-
То же, что и
-a, если не используется-d. В этом случае все недостижимые объекты упаковываются в отдельный cruft-пакет. Недостижимые объекты можно удалить согласно обычным правилам срока хранения при следующем вызовеgitgc(см. git-gc[1]). Несовместим с-k. - --cruft-expiration=<approxidate>
-
Немедленно удалить недостижимые объекты, дата которых предшествует <approxidate>, не дожидаясь следующего вызова
gitgc. Полезно только вместе с--cruft-d. - --max-cruft-size=<n>
-
Переопределить
--max-pack-sizeдля cruft-пакетов. По умолчанию используется значение--max-pack-size(если оно задано). Подробнее см. документацию к--max-pack-size. - --combine-cruft-below-size=<n>
-
При создании cruft-пакетов без очистки перепаковывать только существующие cruft-пакеты размером строго меньше <n> байт; к значению можно добавить суффикс «k», «m» или «g». Cruft-пакеты размером не меньше <n> остаются без изменений и не перепаковываются. Полезно, если нужно избежать перепаковки больших cruft-пакетов в репозиториях с большим количеством и/или размером недостижимых объектов.
- --expire-to=<dir>
-
Записать cruft-пакет с удалёнными объектами (если они есть) в каталог <dir>. Этот параметр полезен для сохранения копии удалённых объектов в отдельном каталоге в качестве резервной копии. Полезно только вместе с
--cruft-d. - -l
-
Передать параметр
--localкомандеgit pack-objects. См. git-pack-objects[1]. - -f
-
Передать параметр
--no-reuse-deltaкомандеgit-pack-objects; см. git-pack-objects[1]. - -F
-
Передать параметр
--no-reuse-objectкомандеgit-pack-objects; см. git-pack-objects[1]. - -q
- --quiet
-
Не выводить сведения о ходе выполнения в поток стандартных ошибок и передать параметр
-qкомандеgit pack-objects. См. git-pack-objects[1]. - -n
-
Не обновлять сведения о сервере с помощью
git update-server-info. Этот параметр пропускает обновление локальных файлов каталога, необходимых для публикации этого репозитория (или его точной копии) по HTTP или FTP. См. git-update-server-info[1]. - --window=<n>
- --depth=<n>
-
Эти два параметра влияют на то, как объекты в пакете хранятся с использованием дельта-сжатия. Сначала объекты сортируются внутри программы по типу, размеру и, при необходимости, именам, а затем сравниваются с другими объектами в пределах
--window, чтобы определить, позволяет ли дельта-сжатие сэкономить место. Параметр--depthограничивает максимальную глубину дельта-цепочки; слишком большая глубина ухудшает производительность распаковки, поскольку для получения нужного объекта дельта-данные требуется применить указанное число раз.Значение --window по умолчанию равно 10, а --depth — 50. Максимальная глубина — 4095.
- --threads=<n>
-
Этот параметр передаётся далее команде
gitpack-objects. - --window-memory=<n>
-
Этот параметр задаёт дополнительное ограничение в дополнение к
--window; размер окна будет динамически уменьшаться, чтобы не использовать более<n>байт памяти. Это полезно в репозиториях, содержащих объекты разных размеров: большой размер окна не приведёт к нехватке памяти, но для небольших объектов всё ещё можно будет использовать большое окно. К значению можно добавить суффикс «k», «m» или «g». Значение--window-memory=0снимает ограничение на использование памяти. По умолчанию используется значение переменной конфигурацииpack.windowMemory. Обратите внимание: фактическое использование памяти будет равно ограничению, умноженному на число потоков, используемых командой git-pack-objects[1]. - --max-pack-size=<n>
-
Максимальный размер каждого создаваемого файла пакета. К значению можно добавить суффикс «k», «m» или «g». Минимально допустимый размер — 1 МиБ. Если этот параметр задан, может быть создано несколько файлов пакетов; кроме того, создание битовой карты индекса будет невозможно. По умолчанию размер не ограничен, если не задана переменная конфигурации
pack.packSizeLimit. Обратите внимание: этот параметр может привести к увеличению размера репозитория и снижению его производительности; см. обсуждение в разделеpack.packSizeLimit. - --filter=<filter-spec>
-
Удалить из результирующего файла пакета объекты, соответствующие спецификации фильтра, и поместить их в отдельный файл пакета. Обратите внимание: объекты, используемые в рабочем каталоге, не фильтруются. Поэтому для корректного разделения лучше выполнять его в чистом репозитории и использовать вместе с этим параметром параметры
-aи-d. Также следует использовать--no-write-bitmap-index(или задать для параметра конфигурацииrepack.writebitmapsзначениеfalse), иначе запись битовой карты индекса завершится ошибкой: предполагается, что все объекты находятся в одном файле пакета. Допустимые формы <filter-spec> см. в git-rev-list[1]. - --filter-to=<dir>
-
Записать пакет с отфильтрованными объектами в каталог <dir>. Полезно только вместе с
--filter. Это можно использовать, чтобы поместить пакет в отдельный каталог объектов, доступ к которому осуществляется с помощью механизма альтернатив Git. ВНИМАНИЕ: если файл пакета с отфильтрованными объектами недоступен, репозиторий может быть повреждён, поскольку доступ к объектам в этом файле пакета может оказаться невозможным. См. разделыobjectsиobjects/info/alternatesв gitrepository-layout[5]. - -b
- --write-bitmap-index
-
Записать битовую карту достижимости в составе перепаковки. Этот параметр имеет смысл только вместе с
-a,-Aили-m, поскольку битовые карты должны иметь возможность ссылаться на все достижимые объекты. Этот параметр переопределяет значениеrepack.writeBitmaps. Если создаётся несколько файлов пакетов, этот параметр не действует, кроме случая записи MIDX (тогда создаётся битовая карта для нескольких пакетов). - --pack-kept-objects
-
Включать при перепаковке объекты из файлов
.keep. Обратите внимание: после завершения.keepмы всё равно не удаляем пакетыpack-objects. Это может привести к дублированию объектов, но делает использование параметра безопасным при одновременной отправке или получении данных. Обычно этот параметр полезен только при записи битовых карт с помощью-bилиrepack.writeBitmaps, поскольку он гарантирует наличие необходимых объектов в файле пакета с битовой картой. - --keep-pack=<pack-name>
-
Исключить указанный пакет из перепаковки. Это эквивалентно наличию файла
.keepдля пакета. <pack-name> — имя файла пакета без начального каталога (например,pack-123.pack). Параметр можно указать несколько раз, чтобы сохранить несколько пакетов. - --unpack-unreachable=<when>
-
При преобразовании недостижимых объектов в отдельные не преобразовывать объекты, дата которых предшествует <when>. Это позволяет не записывать объекты, которые сразу же будут удалены при последующем вызове
gitprune. - -k
- --keep-unreachable
-
При использовании с
-adвсе недостижимые объекты из существующих пакетов будут добавлены в конец файла пакета, а не удалены. Кроме того, все недостижимые отдельные объекты будут упакованы (а их отдельные копии удалены). - -i
- --delta-islands
-
Передать параметр
--delta-islandsкомандеgit-pack-objects; см. git-pack-objects[1]. - -g<factor>
- --geometric=<factor>
-
Упорядочить пакеты так, чтобы каждый следующий пакет содержал как минимум в <factor> раз больше объектов, чем следующий по размеру пакет.
gitrepackобеспечивает это, определяя «срез» файлов пакетов, которые необходимо объединить в один пакет для получения геометрической прогрессии. При этом выбирается наименьший набор файлов пакетов, чтобы как можно больше крупных файлов пакетов (по количеству содержащихся в них объектов) можно было оставить без изменений.В отличие от других режимов перепаковки набор упаковываемых объектов однозначно определяется набором пакетов, которые «сворачиваются», то есть пакетов, объединение которых необходимо для восстановления геометрической прогрессии.
Отдельные объекты неявно включаются в это «сворачивание» независимо от их достижимости. В будущем это может измениться.
При записи битовой карты для нескольких пакетов
gitrepackвыбирает самый большой из получившихся пакетов в качестве предпочтительного для выбора объектов MIDX (см. git-multi-pack-index[1]). - -m
- --write-midx[=<mode>]
-
Записать индекс для нескольких пакетов (см. git-multi-pack-index[1]), содержащий непр избыточные пакеты. Доступны следующие режимы:
-
default -
Записать один MIDX, охватывающий все пакеты. Это режим по умолчанию, если задан
--write-midxбез явного указания режима. -
incremental -
Записать цепочку инкрементальных MIDX вместо одного плоского MIDX.
Без параметра
--geometricв существующую цепочку добавляется новый уровень MIDX (либо создаётся новая цепочка), содержащий пакеты, записанные при перепаковке. Существующие уровни остаются без изменений.В сочетании с
--geometricинкрементальный режим поддерживает цепочку уровней MIDX, которая со временем уплотняется с использованием стратегии геометрического объединения. При каждой перепаковке создаётся новый верхний уровень, содержащий новые записанные пакеты. Затем соседние уровни объединяются, когда количество объектов в более новом уровне превышает1/repack.midxSplitFactorот количества объектов в следующем, более глубоком уровне. Уровни, не соответствующие этому условию, остаются без изменений.В результате новые (верхние) уровни, как правило, содержат много небольших пакетов с относительно малым количеством объектов, а старые (глубокие) уровни — меньшее число крупных пакетов, охватывающих больше объектов. Поскольку уплотнение начинается с вершины цепочки, новые уровни перезаписываются чаще старых; старые затрагиваются только после накопления достаточного количества объектов для оправданного объединения. Благодаря этому общее число уровней растёт логарифмически относительно общего количества объектов.
Кандидатами для геометрической перепаковки считаются только пакеты верхнего уровня MIDX; пакеты на более глубоких уровнях не изменяются. Если верхний уровень содержит меньше пакетов, чем
repack.midxNewLayerThreshold, эти пакеты полностью исключаются из геометрического расчёта, а для новых пакетов создаётся новый уровень, не затрагивающий существующую цепочку.
-
- --name-hash-version=<n>
-
Передать этот аргумент нижележащему процессу
gitpack-objects. Подробности см. в git-pack-objects[1]. - --path-walk
-
Передать параметр
--path-walkнижележащему процессуgitpack-objects. Подробности см. в git-pack-objects[1].
Настройка
На упаковку влияют различные переменные конфигурации; см. git-config[1] (ищите «pack» и «delta»).
По умолчанию команда передаёт параметр --delta-base-offset команде git pack-objects; обычно это приводит к созданию немного меньших пакетов, однако созданные пакеты несовместимы с версиями Git старше 1.4.4. Если необходимо совместно использовать репозиторий с такими древними версиями Git — напрямую или через простой протокол HTTP, — задайте для переменной конфигурации repack.UseDeltaBaseOffset значение «false» и выполните перепаковку. Этот параметр не влияет на доступ к репозиторию из старых версий Git по встроенному протоколу, поскольку в этом случае преобразование при необходимости выполняется на лету.
Дельта-сжатие не применяется к объектам, размер которых превышает значение переменной конфигурации core.bigFileThreshold, а также к файлам, для которых атрибут delta установлен в false.
См. также
repack
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-repack