git-bundle
Имя
git-bundle - Перемещение объектов и ссылок через архив
Синтаксис
git bundle create [-q | --quiet | --progress]
[--version=<version>] <file> <git-rev-list-args>
git bundle verify [-q | --quiet] <file>
git bundle list-heads <file> [<refname>…]
git bundle unbundle [--progress] <file> [<refname>…] Описание
Создание, распаковка и манипулирование файлами «bundle». Бэндлы используются для «оффлайн» передачи Git-объектов без активного «сервера» на другом конце сетевого подключения.
Они могут использоваться для создания как инкрементных, так и полных резервных копий репозитория (см. пример «полной резервной копии» в «ПРИМЕРАХ»), а также для передачи состояния ссылок из одного репозитория в другой (см. второй пример).
Команды Git, которые получают или иным образом «читают» через протоколы, такие как ssh:// и https://, также могут работать с файлами bundle. Возможно git-clone[1] нового репозитория из бэндла, использовать git-fetch[1] для получения данных из него и просмотреть ссылки, содержащиеся в нём, с помощью git-ls-remote[1]. Нет соответствующей поддержки «записи», т.е. git push в бэндл не поддерживается.
Формат бэндла
Бэндлы являются файлами .pack (см. git-pack-objects[1]) с заголовком, указывающим, какие ссылки содержатся в бэндле.
Как и сам формат упакованного архива, бэндлы могут быть самодостаточными или создаваться с использованием исключений. См. раздел «ПРЕДПОСЫЛКИ ОБЪЕКТОВ» ниже.
Бэндлы, созданные с использованием исключений ревизий, являются «тонкими пакетами», созданными с помощью параметра --thin для git-pack-objects[1], и распаковываются с помощью параметра --fix-thin для git-index-pack[1].
Нет возможности создать «толстый пакет», используя исключения ревизий, и пользователи не должны беспокоиться о различии. Использование «тонких пакетов» приводит к тому, что созданные с исключениями бэндлы занимают меньше места. То, что они являются «тонкими» под капотом, отмечается здесь просто из любопытства и как ссылка на другую документацию.
См. gitformat-bundle[5] для получения более подробной информации и обсуждение «тонких пакетов» в gitformat-pack[5] для получения дополнительных подробностей.
Параметры
- create [options] <file> <git-rev-list-args>
-
Используется для создания бэндла с именем
file. Для определения содержимого бэндла требуются аргументы<git-rev-list-args>.optionsсодержит параметры, специфичные для подкомандыgit bundle create. Еслиfileравно-, бэндл записывается в стандартный вывод. - verify <file>
-
Используется для проверки того, что файл бэндла является валидным и будет корректно применён к текущему репозиторию. Это включает в себя проверки формата самого бэндла, а также проверку того, что необходимые коммиты существуют и полностью связаны в текущем репозитории. Затем
git bundleвыводит список отсутствующих коммитов, если таковые имеются. Наконец, выводится информация о дополнительных возможностях, таких как «фильтр объектов». Подробнее см. «Возможности» в gitformat-bundle[5]. Код возврата равен нулю при успехе, но будет отличен от нуля, если файл бэндла некорректен. Еслиfileравно-, бэндл читается из стандартного ввода. - list-heads <file>
-
Выводит список ссылок, определённых в бэндле. Если за этим следует список ссылок, выводятся только ссылки, соответствующие заданным. Если
fileравно-, бэндл читается из стандартного ввода. - unbundle <file>
-
Передаёт объекты из бэндла в
git index-packдля хранения в репозитории, а затем выводит имена всех определённых ссылок. Если задан список ссылок, выводятся только ссылки, соответствующие ссылкам в списке. Эта команда предназначена для внутреннего использования и должна вызываться толькоgit fetch. Еслиfileравно-, бэндл читается из стандартного ввода. - <git-rev-list-args>
-
Список аргументов, допустимых для
git rev-parseиgit rev-list(и содержащий имя ссылки, см. УКАЗАНИЕ ССЫЛОК ниже), определяющий конкретные объекты и ссылки для транспортировки. Например,master~10..masterвызывает упаковку текущей ссылки master вместе со всеми объектами, добавленными после 10-го предка коммита. Нет явного ограничения на количество ссылок и объектов, которые могут быть упакованы. - [<refname>…]
-
Список ссылок, используемых для ограничения выводимых доступных ссылок. В основном используется командой
git fetch, которая ожидает получить только запрошенные ссылки, а не всё содержимое пакета (в этом случае,git bundleдействует какgit fetch-pack). - --progress
-
Статус выполнения сообщается в поток стандартной ошибки по умолчанию при подключении к терминалу, если не указан параметр -q. Этот флаг принудительно отображает статус выполнения, даже если поток стандартной ошибки не направлен на терминал.
- --version=<version>
-
Указывает версию бэндла. Версия 2 — это более старый формат, который можно использовать только с репозиториями SHA-1; более новая версия 3 содержит возможности, которые позволяют расширения. По умолчанию используется наиболее старый поддерживаемый формат, основанный на используемом алгоритме хеширования.
- -q
- --quiet
-
Этот флаг делает так, чтобы команда не сообщала о своём ходе выполнения в поток стандартной ошибки.
Указание ссылок
Ревизии должны сопровождаться именами ссылок, чтобы быть упакованными в бэндл. В качестве альтернативы можно использовать --all для упаковки всех ссылок.
Можно упаковать более одной ссылки и указать более одного набора необходимых объектов. Упакованными будут объекты, не содержащиеся в объединении предварительных условий.
Команда git bundle create разрешает имена ссылок, используя те же правила, что и git rev-parse --abbrev-ref=loose. Каждый предварительный объект может быть указан явно (например, ^master~10 ) или неявно (например, master~10..master, --since=10.days.ago master).
Все эти простые случаи допустимы (предполагая, что у нас есть ветки «master» и «next»):
$ git bundle create master.bundle master $ echo master | git bundle create master.bundle --stdin $ git bundle create master-and-next.bundle master next $ (echo master; echo next) | git bundle create master-and-next.bundle --stdin
И также эти (и аналогичные, но опущенные --stdin примеры):
$ git bundle create recent-master.bundle master~10..master $ git bundle create recent-updates.bundle master~10..master next~5..next
Имя ревизии или диапазон, правая граница которого не может быть разрешена до ссылки, не принимается:
$ git bundle create HEAD.bundle $(git rev-parse HEAD) fatal: Refusing to create empty bundle. $ git bundle create master-yesterday.bundle master~10..master~5 fatal: Refusing to create empty bundle.
Предварительные условия для объектов
При создании бэндлов можно создать самодостаточный бэндл, который можно распаковать в репозиторий без общей истории, а также указать отрицательные ревизии, чтобы исключить объекты, необходимые в более ранних частях истории.
Передача ревизии, такой как new в git bundle create , создаст файл бэндла, содержащий все объекты, доступные от ревизии new. Этот бэндл может быть распакован в любой репозиторий, чтобы получить полную историю, ведущую к ревизии new:
$ git bundle create full.bundle new
Диапазон ревизий, такой как old..new , создаст файл бэндла, который потребует, чтобы ревизия old (и любые объекты, доступные от неё) существовали, чтобы бэндл можно было «распаковать»:
$ git bundle create full.bundle old..new
Самодостаточный бэндл без предварительных условий можно извлечь в любое место, даже в пустой репозиторий, или клонировать из него (т.е., new, но не old..new).
Можно допустимо создавать файл бэндла, содержащий объекты, уже находящиеся в пункте назначения, так как они игнорируются при распаковке в пункт назначения.
Если нужно предоставить тот же набор ссылок, что и при прямом клонировании из исходного репозитория, используйте --branches --tags для <git-rev-list-args>.
Команда git bundle verify может использоваться для проверки, имеет ли репозиторий получателя необходимые предварительные коммиты для бэндла.
Примеры
Рассмотрим два случая:
-
Полное резервное копирование репозитория
-
Перенос истории репозитория на другой компьютер, когда между компьютерами нет прямого подключения
Сначала рассмотрим полное резервное копирование репозитория. Следующая команда выполнит полное резервное копирование репозитория, включив все ссылки (refs):
$ git bundle create backup.bundle --all
Но обратите внимание, что это только для ссылок (refs), т.е. вы включите только ссылки и коммиты, доступные по этим ссылкам. Вы не включите другой локальный статус, например, содержимое индекса, рабочей области, отложенных изменений, конфигурацию репозитория, хуки и т.д.
Позже вы можете восстановить этот репозиторий, например, с помощью git-clone[1]:
$ git clone backup.bundle <new directory>
Для следующего примера предположим, что вы хотите перенести историю репозитория R1 на машине А в другой репозиторий R2 на машине B. По какой-либо причине прямое подключение между А и B недоступно, но мы можем передавать данные с А на B через какой-либо механизм (CD, электронная почта и т.д.). Мы хотим обновить R2 с разработкой, проведённой на ветке master в R1.
Для запуска процесса вы можете сначала создать пакет, не имеющий каких-либо предварительных условий. Вы можете использовать тег, чтобы запомнить, до какого коммита вы последний раз обрабатывали данные, чтобы позже было легко обновить другой репозиторий с помощью инкрементного пакета:
machineA$ cd R1 machineA$ git bundle create file.bundle master machineA$ git tag -f lastR2bundle master
Затем передайте файл file.bundle на целевую машину B. Поскольку этот пакет не требует извлечения каких-либо существующих объектов, вы можете создать новый репозиторий на машине B, клонировав его из пакета:
machineB$ git clone -b master /home/me/tmp/file.bundle R2
Это определит удалённый ресурс под названием "origin" в результирующем репозитории, который позволит вам получать и подключать данные из пакета. В файле $GIT_DIR/config в R2 будет запись примерно такого вида:
[remote "origin"]
url = /home/me/tmp/file.bundle
fetch = refs/heads/*:refs/remotes/origin/* Чтобы обновить получившийся репозиторий mine.git, можно выполнить команду fetch или pull после замены сохранённого пакета /home/me/tmp/file.bundle на инкрементные обновления.
После дальнейшей работы в исходном репозитории можно создать инкрементный пакет для обновления другого репозитория:
machineA$ cd R1 machineA$ git bundle create file.bundle lastR2bundle..master machineA$ git tag -f lastR2bundle master
Затем передайте пакет на другой компьютер, чтобы заменить /home/me/tmp/file.bundle, и выполните pull.
machineB$ cd R2 machineB$ git pull
Если вы знаете, до какого коммита целевой репозиторий должен иметь необходимые объекты, вы можете использовать эти знания для указания предварительных условий, установив точку отсечения, чтобы ограничить версии и объекты, которые войдут в результирующий пакет. В предыдущем примере для этой цели использовался тег lastR2bundle, но вы можете использовать любые другие варианты, которые вы можете указать в команде git-log[1]. Вот ещё несколько примеров:
Вы можете использовать тег, который присутствует в обоих репозиториях:
$ git bundle create mybundle v1.0.0..master
Вы можете использовать предварительное условие, основанное на времени:
$ git bundle create mybundle --since=10.days master
Вы можете использовать количество коммитов:
$ git bundle create mybundle -10 master
Вы можете выполнить git-bundle verify , чтобы проверить, можно ли извлечь данные из пакета, созданного с предварительным условием:
$ git bundle verify mybundle
Это покажет, какие коммиты вам необходимы для извлечения данных из пакета и выдаст ошибку, если их нет.
Пакет с точки зрения репозитория получателя — это просто обычный репозиторий, из которого можно получать или подключать данные. Например, можно сопоставить ссылки при получении данных:
$ git fetch mybundle master:localRef
Также можно посмотреть, какие ссылки он предоставляет:
$ git ls-remote mybundle
Обсуждение
Примитивный способ создания полного резервного копирования репозитория — использовать что-то вроде cp -r <repo> <destination>. Это не рекомендуется, так как репозиторий может быть записан во время операции копирования. В результате некоторые файлы в <destination> могут быть повреждены.
Поэтому рекомендуется использовать инструменты Git для создания резервных копий репозиториев, либо с помощью данной команды, либо, например, с помощью git-clone[1]. Но имейте в виду, что эти инструменты не помогут вам создать резервную копию состояния, кроме refs и коммитов. Другими словами, они не помогут вам создать резервную копию содержимого индекса, рабочей области, отложенных изменений, конфигурации репозитория, хуков и т.д.
См. также gitfaq[7], раздел "ПЕРЕДАЧИ", для обсуждения проблем, связанных с синхронизацией файлов между системами.
Формат файла
См. gitformat-bundle[5].
bundle
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-bundle