Spec-Zone.ru › Git

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. Это очистит объекты, оставленные командой git prune, но показываемые командой git fsck --full --dangling как недостижимые.

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

Файлы пакетов promisor перепаковываются отдельно: если у файлов пакетов есть соответствующий файл «.promisor», эти файлы пакетов будут перепакованы в другой отдельный пакет, а для нового отдельного пакета будет создан пустой файл «.promisor».

-A

То же, что и -a, если не используется -d. В этом случае все недостижимые объекты из предыдущего пакета становятся отдельными распакованными объектами, а не остаются в старом пакете. Недостижимые объекты никогда намеренно не добавляются в пакет, даже при перепаковке. Этот параметр предотвращает немедленное удаление недостижимых объектов: они остаются в старом пакете, который затем удаляется. Вместо этого отдельные недостижимые объекты будут удалены согласно обычным правилам срока хранения при следующем вызове git gc. См. git-gc[1].

-d

После упаковки удалить избыточные пакеты, если вновь созданные пакеты делают некоторые существующие пакеты избыточными. Также запустить git prune-packed для удаления избыточных файлов отдельных объектов.

--cruft

То же, что и -a, если не используется -d. В этом случае все недостижимые объекты упаковываются в отдельный cruft-пакет. Недостижимые объекты можно удалить согласно обычным правилам срока хранения при следующем вызове git gc (см. git-gc[1]). Несовместим с -k.

--cruft-expiration=<approxidate>

Немедленно удалить недостижимые объекты, дата которых предшествует <approxidate>, не дожидаясь следующего вызова git gc. Полезно только вместе с --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>

Этот параметр передаётся далее команде git pack-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>. Это позволяет не записывать объекты, которые сразу же будут удалены при последующем вызове git prune.

-k
--keep-unreachable

При использовании с -ad все недостижимые объекты из существующих пакетов будут добавлены в конец файла пакета, а не удалены. Кроме того, все недостижимые отдельные объекты будут упакованы (а их отдельные копии удалены).

-i
--delta-islands

Передать параметр --delta-islands команде git-pack-objects; см. git-pack-objects[1].

-g<factor>
--geometric=<factor>

Упорядочить пакеты так, чтобы каждый следующий пакет содержал как минимум в <factor> раз больше объектов, чем следующий по размеру пакет.

git repack обеспечивает это, определяя «срез» файлов пакетов, которые необходимо объединить в один пакет для получения геометрической прогрессии. При этом выбирается наименьший набор файлов пакетов, чтобы как можно больше крупных файлов пакетов (по количеству содержащихся в них объектов) можно было оставить без изменений.

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

Отдельные объекты неявно включаются в это «сворачивание» независимо от их достижимости. В будущем это может измениться.

При записи битовой карты для нескольких пакетов git repack выбирает самый большой из получившихся пакетов в качестве предпочтительного для выбора объектов 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>

Передать этот аргумент нижележащему процессу git pack-objects. Подробности см. в git-pack-objects[1].

--path-walk

Передать параметр --path-walk нижележащему процессу git pack-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.

См. также

git-pack-objects[1] git-prune-packed[1]

repack

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

Spec-Zone.ru

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