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 no changes
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 no changes
-
2.51.0
2025-08-18
- 2.49.1 → 2.50.1 no changes
-
2.49.0
2025-03-14
- 2.43.1 → 2.48.2 no changes
-
2.43.0
2023-11-20
- 2.37.1 → 2.42.4 no changes
-
2.37.0
2022-06-27
- 2.35.1 → 2.36.6 no changes
-
2.35.0
2022-01-24
- 2.33.1 → 2.34.8 no changes
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 no changes
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 no changes
-
2.31.0
2021-03-15
- 2.29.1 → 2.30.9 no changes
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 no changes
-
2.27.0
2020-06-01
- 2.23.1 → 2.26.3 no changes
-
2.23.0
2019-08-16
- 2.21.1 → 2.22.5 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.18.1 → 2.19.6 no changes
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 no changes
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
- 2.15.4 no changes
-
2.14.6
2019-12-06
- 2.10.5 → 2.13.7 no changes
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.5.6 → 2.7.6 no changes
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 no changes
-
2.0.5
2014-12-17
ОБЗОР
git pack-objects [-q | --progress | --all-progress] [--all-progress-implied] [--no-reuse-delta] [--delta-base-offset] [--non-empty] [--local] [--incremental] [--window=<n>] [--depth=<n>] [--revs [--unpacked | --all]] [--keep-pack=<имя-пакета>] [--cruft] [--cruft-expiration=<время>] [--stdout [--filter=<спецификатор-фильтра>] | <базовое-имя>] [--shallow] [--keep-true-parents] [--[no-]sparse] [--name-hash-version=<n>] [--path-walk] < <список-объектов>
ОПИСАНИЕ
Читает список объектов из стандартного ввода и записывает либо один или несколько упакованных архивов с указанным базовым именем на диск, либо упакованный архив в стандартный вывод.
Упакованный архив — это эффективный способ передачи набора объектов между двумя репозиториями, а также эффективный для доступа формат архивации. В упакованном архиве объект хранится либо как сжатое целое, либо как различие от некоторого другого объекта. Последнее часто называется дельтой.
Формат упакованного архива (.pack) спроектирован как самодостаточный, чтобы его можно было распаковать без какой-либо дополнительной информации. Следовательно, каждый объект, от которого зависит дельта, должен присутствовать в пакете.
Файл индекса пакета (.idx) создаётся для быстрого произвольного доступа к объектам в пакете. Размещение как файла индекса (.idx), так и упакованного архива (.pack) в подкаталоге pack/ в $GIT_OBJECT_DIRECTORY (или любом из каталогов в $GIT_ALTERNATE_OBJECT_DIRECTORIES) позволяет Git читать из упакованного архива.
Команда git unpack-objects может читать упакованный архив и разворачивать объекты, содержащиеся в пакете, в формат «один файл — один объект»; обычно это делается командами smart-pull, когда пакет создаётся на лету для эффективной сетевой передачи их партнёрами.
ПАРАМЕТРЫ
- base-name
-
Записывать в пары файлов (.pack и .idx), используя <базовое-имя> для определения имени создаваемого файла. При использовании этого параметра два файла в паре записываются в файлы <базовое-имя>-<SHA-1>.{pack,idx}. <SHA-1> — это хеш, основанный на содержимом пакета, и он записывается в стандартный вывод команды.
- --stdout
-
Записывать содержимое пакета (то, что было бы записано в файл .pack) в стандартный вывод.
- --revs
-
Читать аргументы редакций из стандартного ввода вместо отдельных имён объектов. Аргументы редакций обрабатываются так же, как git rev-list с флагом
--objectsиспользует свои аргументыcommitдля построения списка объектов, которые он выводит. Объекты в результирующем списке упаковываются. Кроме редакций, также принимаются строки--notили--shallow<SHA-1>. - --unpacked
-
Это подразумевает
--revs. При обработке списка аргументов редакций, прочитанных из стандартного ввода, ограничить упаковываемые объекты теми, которые ещё не упакованы. - --all
-
Это подразумевает
--revs. В дополнение к списку аргументов редакций, прочитанных из стандартного ввода, подразумевать, что все ссылки вrefs/указаны для включения. - --include-tag
-
Включать незапрошенные аннотированные метки, если объект, на который они ссылаются, был включён в результирующий pack-файл. Это может быть полезно для отправки новых меток нативным клиентам Git.
- --stdin-packs[=<режим>]
-
Читать базовые имена pack-файлов (например,
pack-1234abcd.pack) из стандартного ввода вместо имён объектов или аргументов редакций. Результирующий пакет содержит все объекты, перечисленные во включаемых пакетах (те, которые не начинаются с^), исключая любые объекты, перечисленные в исключаемых пакетах (начинающихся с^).Когда режим установлен в «follow», объекты из пакетов, не перечисленных в stdin, получают особую обработку. Объекты в не перечисленных пакетах будут включены, если эти объекты (1) достижимы из включаемых пакетов и (2) не найдены ни в одном исключаемом пакете. Этот режим полезен, например, для восстановления когда-то недостижимых объектов, найденных в пакетах cruft, для создания пакетов, которые замкнуты относительно достижимости вплоть до границы, установленной исключаемыми пакетами.
Несовместим с
--revsили параметрами, которые подразумевают--revs(такими как--all), за исключением--unpacked, который совместим. - --cruft
-
Упаковывает недостижимые объекты в отдельный пакет «cruft», обозначаемый наличием файла
.mtimes. Обычно используетсяgitrepack--cruft. Вызывающие стороны предоставляют список имён пакетов и указывают, какие пакеты останутся в репозитории, а также какие пакеты будут удалены (обозначаются префиксом-). Содержимое пакета cruft — это все объекты, не содержащиеся в сохраняющихся пакетах, которые не превысили льготный период (см.--cruft-expirationниже), или которые превысили льготный период, но достижимы из другого объекта, который его не превысил.Когда входные данные содержат пакет, содержащий все достижимые объекты (и перечисляют все другие пакеты как ожидающие удаления), соответствующий пакет cruft будет содержать все недостижимые объекты (с mtime новее, чем
--cruft-expiration) вместе с любыми недостижимыми объектами, чьё mtime старше--cruft-expiration, но которые достижимы из недостижимого объекта, чьё mtime новее--cruft-expiration).Несовместим с
--unpack-unreachable,--keep-unreachable,--pack-loose-unreachable,--stdin-packs, а также с любыми другими параметрами, которые подразумевают--revs. - --cruft-expiration=<приблизительная-дата>
-
Если указано, объекты исключаются из пакета cruft, если их mtime старше <приблизительная-дата>. Если не указано (и задано
--cruft), то никакие объекты не исключаются. - --window=<n>
- --depth=<n>
-
Эти два параметра влияют на то, как объекты, содержащиеся в пакете, хранятся с использованием дельта-сжатия. Объекты сначала внутренне сортируются по типу, размеру и, возможно, именам и сравниваются с другими объектами в пределах --window, чтобы увидеть, экономит ли использование дельта-сжатия место. --depth ограничивает максимальную глубину дельты; слишком большая глубина влияет на производительность на стороне распаковщика, потому что дельта-данные должны применяться столько раз, чтобы добраться до необходимого объекта.
Значение по умолчанию для --window — 10, а для --depth — 50. Максимальная глубина — 4095.
- --window-memory=<n>
-
Этот параметр обеспечивает дополнительное ограничение поверх
--window; размер окна будет динамически уменьшаться, чтобы не занимать более <n> байт в памяти. Это полезно в репозиториях со смесью больших и маленьких объектов, чтобы не исчерпать память при большом окне, но при этом иметь возможность использовать большое окно для меньших объектов. Размер может иметь суффикс «k», «m» или «g».--window-memory=0делает использование памяти неограниченным. Значение по умолчанию берётся из переменной конфигурацииpack.windowMemory. - --max-pack-size=<n>
-
В необычных сценариях вы можете не иметь возможности создавать файлы больше определённого размера в вашей файловой системе, и этот параметр можно использовать, чтобы указать команде разделить выходной pack-файл на несколько независимых pack-файлов, каждый из которых не превышает заданный размер. Размер может иметь суффикс «k», «m» или «g». Минимальный допустимый размер ограничен 1 МиБ. По умолчанию неограничен, если не установлена переменная конфигурации
pack.packSizeLimit. Обратите внимание, что этот параметр может привести к увеличению размера и замедлению репозитория; см. обсуждение вpack.packSizeLimit. - --honor-pack-keep
-
Этот флаг заставляет игнорировать объект, уже находящийся в локальном пакете с файлом .keep, даже если в противном случае он был бы упакован.
- --keep-pack=<pack-name>
-
Этот флаг заставляет игнорировать объект, уже находящийся в указанном пакете, даже если в противном случае он был бы упакован. <имя-пакета> — это имя pack-файла без ведущего каталога (например,
pack-123.pack). Параметр может быть указан несколько раз, чтобы сохранить несколько пакетов. - --incremental
-
Этот флаг заставляет игнорировать объект, уже находящийся в пакете, даже если в противном случае он был бы упакован.
- --local
-
Этот флаг заставляет игнорировать объект, заимствованный из дополнительного хранилища объектов, даже если в противном случае он был бы упакован.
- --non-empty
-
Создавать упакованный архив, только если он будет содержать хотя бы один объект.
- --progress
-
Прогресс по умолчанию направляется в стандартный вывод ошибок, если этот поток подключен к терминалу. Флаг -q меняет это умолчание: с этим флагом прогресс направляется в стандартный вывод ошибок даже в том случае, когда этот поток не подключен к терминалу.
- --all-progress
-
Когда указан --stdout, отчёт о ходе выполнения отображается во время фаз подсчёта объектов и сжатия, но подавляется во время фазы записи. Причина в том, что в некоторых случаях выходной поток напрямую связан с другой командой, которая может захотеть отображать свой собственный ход выполнения по мере обработки входящих данных пакета. Этот флаг похож на --progress, за исключением того, что он принудительно включает отчёт о ходе выполнения для фазы записи, даже если используется --stdout.
- --all-progress-implied
-
Это используется для подразумевания --all-progress всякий раз, когда активирован показ хода выполнения. В отличие от --all-progress, этот флаг сам по себе фактически не принуждает к показу хода выполнения.
- -q
-
Этот флаг заставляет команду не сообщать о своём прогрессе в стандартный поток ошибок.
- --no-reuse-delta
-
При создании упакованного архива в репозитории, который уже имеет существующие пакеты, команда повторно использует существующие дельты. Это иногда приводит к несколько неоптимальному пакету. Этот флаг указывает команде не повторно использовать существующие дельты, а вычислять их заново.
- --no-reuse-object
-
Этот флаг указывает команде вообще не повторно использовать существующие данные объектов, включая не дельтифицированные объекты, принудительно выполняя повторное сжатие всего. Это подразумевает --no-reuse-delta. Полезен только в редком случае, когда требуется массовое применение другого уровня сжатия к упакованным данным.
- --compression=<n>
-
Указывает уровень сжатия для вновь сжимаемых данных в создаваемом пакете. Если не указан, уровень сжатия пакета сначала определяется pack.compression, затем core.compression, и по умолчанию равен -1 (по умолчанию zlib), если не установлено ни одно из них. Добавьте --no-reuse-object, если вы хотите принудительно установить единый уровень сжатия для всех данных независимо от источника.
- --sparse
- --no-sparse
-
Переключает «разрежённый» (sparse) алгоритм для определения того, какие объекты включать в пакет, в сочетании с опцией «--revs». Этот алгоритм обходит только деревья, которые появляются в путях, вводящих новые объекты. Это может дать значительный выигрыш в производительности при вычислении пакета для отправки небольшого изменения. Однако возможно, что в файл пакета будут добавлены дополнительные объекты, если включённые коммиты содержат определённые типы прямых переименований. Если этот параметр не включён, по умолчанию используется значение
pack.useSparse, которое равно true, если не указано иное. - --thin
-
Создать «тонкий» (thin) пакет, опуская общие объекты между отправителем и получателем, чтобы уменьшить сетевой трафик. Этот параметр имеет смысл только в сочетании с --stdout.
Примечание: Тонкий пакет нарушает формат упакованного архива, опуская необходимые объекты, и поэтому не может использоваться Git без приведения его к самодостаточному виду. Используйте
gitindex-pack--fix-thin(см. git-index-pack[1]), чтобы восстановить свойство самодостаточности. - --shallow
-
Оптимизировать пакет, который будет предоставлен клиенту с частичным (shallow) репозиторием. Этот параметр в сочетании с --thin может привести к меньшему размеру пакета ценой скорости.
- --delta-base-offset
-
Упакованный архив может выражать базовый объект дельты либо как 20-байтовое имя объекта, либо как смещение в потоке, но древние версии Git не понимают последнее. По умолчанию git pack-objects использует только первый формат для лучшей совместимости. Этот параметр позволяет команде использовать второй формат для компактности. В зависимости от средней длины цепочки дельт, этот параметр обычно уменьшает результирующий файл пакета на 3-5 процентов.
Примечание: Высокоуровневые команды (porcelain), такие как
gitgc(см. git-gc[1]),gitrepack(см. git-repack[1]), по умолчанию передают этот параметр в современном Git, когда они помещают объекты в вашем репозитории в pack-файлы. То же самое делаетgitbundle(см. git-bundle[1]), когда создаёт пакет. - --threads=<n>
-
Указывает количество потоков, которые будут созданы при поиске наилучших соответствий дельт. Для этого требуется, чтобы pack-objects был скомпилирован с pthreads, иначе этот параметр игнорируется с предупреждением. Это предназначено для сокращения времени упаковки на многопроцессорных машинах. Однако требуемый объём памяти для окна поиска дельт умножается на количество потоков. Указание 0 заставит Git автоматически определить количество ЦП и соответственно установить количество потоков.
- --index-version=<version>[,<offset>]
-
Предназначено для использования только набором тестов. Позволяет принудительно задать версию для создаваемого индекса пакета и принудительно использовать 64-битные записи индекса для объектов, расположенных выше указанного смещения.
- --keep-true-parents
-
С этим параметром родители, скрытые сбросами (grafts), тем не менее упаковываются.
- --filter=<filter-spec>
-
Исключает определённые объекты (обычно blob-объекты) из результирующего pack-файла. Допустимые формы <спецификатор-фильтра> см. в git-rev-list[1].
- --no-filter
-
Отключает любой предыдущий аргумент
--filter=. - --missing=<missing-action>
-
Параметр отладки, помогающий будущей разработке «частичного клонирования». Этот параметр определяет, как обрабатываются отсутствующие объекты.
Форма --missing=error требует, чтобы pack-objects остановился с ошибкой, если встретится отсутствующий объект. Если репозиторий является частичным клоном, перед объявлением объектов отсутствующими будет предпринята попытка их получения. Это действие по умолчанию.
Форма --missing=allow-any позволяет продолжить обход объектов, если встретится отсутствующий объект. Получение отсутствующего объекта не произойдёт. Отсутствующие объекты будут молча опущены в результатах.
Форма --missing=allow-promisor похожа на allow-any, но позволяет продолжить обход объектов только для ОЖИДАЕМЫХ отсутствующих объектов-поручителей (promisor). Получение отсутствующего объекта не произойдёт. Неожиданный отсутствующий объект вызовет ошибку.
- --exclude-promisor-objects
-
Опускать объекты, которые, как известно, находятся во внешнем репозитории-поручителе (promisor). (Этот параметр предназначен для работы только с локально созданными объектами, чтобы при переупаковке мы по-прежнему сохраняли различие между локально созданными объектами [без .promisor] и объектами из внешнего репозитория-поручителя [с .promisor].) Используется с частичным клонированием.
- --keep-unreachable
-
Объекты, недостижимые из ссылок в пакетах, указанных с помощью параметра --unpacked=, добавляются в результирующий пакет в дополнение к достижимым объектам, которые не находятся в пакетах, помеченных файлами *.keep. Это подразумевает
--revs. - --pack-loose-unreachable
-
Упаковать недостижимые непакованные (loose) объекты (а их непакованные копии удалить). Это подразумевает
--revs. - --unpack-unreachable
-
Сохранять недостижимые объекты в непакованном (loose) виде. Это подразумевает
--revs. - --delta-islands
-
Ограничивать сопоставления дельт на основе «островов». См. ДЕЛЬТА-ОСТРОВА ниже.
- --name-hash-version=<n>
-
При выполнении дельта-сжатия Git группирует объекты, которые могут быть похожи, на основе эвристик, использующих путь к этому объекту. Хотя группировка объектов по точному совпадению пути хороша для путей со многими версиями, есть преимущества в поиске пар дельт в разных полных путях. Git собирает объекты по типу, затем по «хешу имени» (name hash) пути, а затем по размеру, надеясь сгруппировать объекты, которые будут хорошо сжиматься вместе.
Версия хеша имени по умолчанию —
1, которая отдаёт приоритет локальности хеша, считая, что последние байты пути вносят максимальный вклад в хеш-функцию. Эта версия превосходно отличает короткие пути и находит переименования между каталогами. Однако хеш-функция в основном зависит от последних 16 байтов пути. Если в репозитории много путей, у которых одинаковые последние 16 байтов и они различаются только родительским каталогом, то этот хеш имени может привести к слишком большому количеству коллизий и дать плохие результаты. В настоящее время эта версия требуется при записи файлов битовых карт достижимости (reachability bitmap) с--write-bitmap-index.Версия хеша имени
2имеет аналогичные возможности локальности, что и версия1, за исключением того, что она рассматривает каждый компонент пути отдельно и накладывает хеши со сдвигом. Это по-прежнему отдаёт приоритет последним байтам пути, но также «солит» младшие биты хеша, используя имена родительских каталогов. Этот метод обеспечивает некоторые преимущества локальности версии1, одновременно устраняя большинство коллизий от файлов с похожими именами, появляющихся во многих разных каталогах. В настоящее время эта версия не разрешена при записи файлов битовых карт достижимости (reachability bitmap) с--write-bitmap-index, и она будет автоматически изменена на версию1. - --path-walk
-
Выполнять сжатие, сначала группируя объекты по пути, а затем выполняя второй проход, который сжимает между путями как обычно. Это может улучшить дельта-сжатие, особенно при наличии имён файлов, вызывающих коллизии в алгоритме хеша имени Git по умолчанию.
Несовместим с
--delta-islands,--shallowили--filter. Параметр--use-bitmap-indexбудет игнорироваться в присутствии--path-walk.
ДЕЛЬТА-ОСТРОВА
Когда это возможно, pack-objects пытается повторно использовать существующие на диске дельты, чтобы избежать необходимости искать новые на лету. Это важная оптимизация для обслуживания запросов на получение (fetch), поскольку это означает, что сервер может вообще избежать распаковки большинства объектов и просто отправлять байты напрямую с диска. Эта оптимизация не работает, когда объект хранится как дельта относительно базы, которой у получателя нет (и которую мы ещё не отправляем). В этом случае сервер «разрывает» дельту и должен найти новую, что требует больших затрат ЦП. Поэтому для производительности важно, чтобы набор объектов в отношениях дельт на диске соответствовал тому, что клиент будет получать.
В обычном репозитории это, как правило, работает автоматически. Объекты в основном достижимы из веток и меток, и именно их получают клиенты. Любые дельты, которые мы находим на сервере, скорее всего, находятся между объектами, которые у клиента уже есть или будут.
Но в некоторых конфигурациях репозиториев у вас может быть несколько связанных, но отдельных групп верхушек ссылок, и клиенты обычно получают эти группы независимо. Например, представьте, что вы размещаете несколько «форков» репозитория в одном общем хранилище объектов и позволяете клиентам видеть их как отдельные репозитории через GIT_NAMESPACE или отдельные репозитории с использованием механизма альтернатив. Наивная переупаковка может обнаружить, что оптимальная дельта для объекта — относительно базы, которая находится только в другом форке. Но когда клиент получает данные, у него не будет этого базового объекта, и нам придётся искать новую дельту на лету.
Похожая ситуация может возникнуть, если у вас есть много ссылок вне refs/heads/ и refs/tags/, указывающих на связанные объекты (например, refs/pull или refs/changes, используемые некоторыми хостинг-провайдерами). По умолчанию клиенты получают только головы и метки, и дельты относительно объектов, найденных только в этих других группах, не могут быть отправлены как есть.
Дельта-острова решают эту проблему, позволяя группировать ваши ссылки в отдельные «острова». Pack-objects вычисляет, какие объекты достижимы из каких островов, и отказывается создавать дельту из объекта A относительно базы, которая отсутствует во всех островах A. Это приводит к немного большим пакетам (потому что мы упускаем некоторые возможности для дельт), но гарантирует, что получение одного острова не потребует пересчёта дельт на лету из-за пересечения границ островов.
При переупаковке с дельта-островами окно дельт имеет тенденцию забиваться кандидатами, запрещёнными конфигурацией. Переупаковка с большим --window помогает (и не занимает так много времени, как могла бы, потому что мы можем отклонить некоторые пары объектов на основе островов до выполнения каких-либо вычислений содержимого).
Острова настраиваются с помощью параметра pack.island, который может быть указан несколько раз. Каждое значение — это регулярное выражение с привязкой к левому краю, соответствующее именам ссылок. Например:
[pack] island = refs/heads/ island = refs/tags/
помещает головы и метки в один остров (имя которого — пустая строка; см. ниже подробнее об именовании). Любые ссылки, не соответствующие этим регулярным выражениям (например, refs/pull/123), не находятся ни в каком острове. Любой объект, достижимый только из refs/pull/ (но не из голов или меток), поэтому не может использоваться в качестве базы для refs/heads/.
Ссылки группируются в острова на основе их «имён», и два регулярных выражения, которые дают одно и то же имя, считаются находящимися в одном острове. Имена вычисляются из регулярных выражений путём конкатенации любых захваченных групп из регулярного выражения с дефисом «-» между ними. (И если нет захваченных групп, то имя — это пустая строка, как в приведённом выше примере.) Это позволяет создавать произвольное количество островов. Однако поддерживается не более 14 таких захваченных групп.
Например, представьте, что вы храните ссылки для каждого форка в refs/virtual/ID, где ID — это числовой идентификатор. Тогда вы можете настроить:
[pack] island = refs/virtual/([0-9]+)/heads/ island = refs/virtual/([0-9]+)/tags/ island = refs/virtual/([0-9]+)/(pull)/
Это помещает головы и метки для каждого форка в свой собственный остров (названный «1234» или что-то подобное), а ссылки pull для каждого попадают в свой собственный «1234-pull».
Обратите внимание, что мы выбираем один остров для каждого регулярного выражения, используя порядок «последний выигрывает» (что позволяет конфигурации, специфичной для репозитория, иметь приоритет над общепользовательской конфигурацией и так далее).
КОНФИГУРАЦИЯ
Различные переменные конфигурации влияют на упаковку, см. git-config[1] (поиск по «pack» и «delta»).
Примечательно, что дельта-сжатие не используется для объектов, размер которых превышает значение переменной конфигурации core.bigFileThreshold, и для файлов с атрибутом delta, установленным в false.
GIT
Является частью пакета git[1]