Bundle Git репозиторий без клонирования
Как я могу связать проект git, не клонируя его каждый раз? Прямо сейчас я делаю всегда команды ниже.
git clone --mirror http://git_project
cd git_project
git bundle create '../git_project.lock' --all
cd ..
rm git_project -Force -Recurse
Я хочу сделать это в одной команде, что-то вроде:
git bundle create '../git_project.lock' --all --repository http://git_project
1 ответ
Я хочу получить эти файлы пакетов в качестве резервной копии на другой машине.
После моего ответа в 2011 году (одиннадцать лет назад) теперь у вас есть удаленные конвейеры, такие как GitHub Actions или GitLab CI.
Автоматизированный конвейер в этих службах размещения удаленных репозиториев Git может создать для вас пакет и сохранить его на сервере или в резервной копии.
Это сегодня.
Завтра вы сможете получить доступ к выделенному серверу с пакетом git через URI пакета .
В Git 2.38 (3 квартал 2022 г.) дизайн «URI пакета» документируется.
См. , (9 августа 2022 г.) .
(Объединено в коммите 0d133a3, 18 августа 2022 г.)
коммит 2da14fa
docs
: стандарт URI пакета документовПодписал: Деррик Столи
Внедрите идею пакетных URI в кодовую базу Git с помощью желательного проектного документа.
Этот документ включает в себя полный дизайн, предназначенный для включения функции в ее полностью реализованной форме.
Для этого потребуется несколько шагов, подробно описанных в разделе «План реализации».Зафиксировав этот документ сейчас, его можно использовать для мотивации изменений, необходимых для достижения этих конечных целей.
Дизайн все еще может быть изменен по мере обнаружения новой информации.
теперь включает в свою справочную страницу :
Объединение URI
Пакеты Git — это файлы, в которых хранится пакетный файл вместе с некоторыми дополнительными метаданными, включая набор ссылок и (возможно, пустой) набор необходимых коммитов. Видеть
git bundle
и ссылка:bundle-format.txt[формат пакета] для получения дополнительной информации.Bundle URI — это места, где Git может загрузить один или несколько пакетов, чтобы загрузить базу данных объектов перед получением оставшихся объектов с удаленного устройства.
Одна из целей — ускорить клонирование и выборку для пользователей с плохим сетевым подключением к исходному серверу. Еще одним преимуществом является предоставление возможности активным пользователям, таким как фермы сборки CI, использовать локальные ресурсы для большинства данных Git и тем самым снизить нагрузку на исходный сервер.
Чтобы включить функцию URI пакета, пользователи могут указать URI пакета, используя параметры командной строки, или исходный сервер может объявить один или несколько URI с помощью возможности протокола v2.
Смотрите также
И:
коммит d06ed85: добавить пример организации пакета
Подписал: Деррик Столи
Добавьте раздел, в котором подробно описывается, как может работать поставщик пакетов, включая использование объявления сервера Git для нескольких географически распределенных серверов.
Эта организация основана на кэш-серверах GVFS, которые успешно использовали аналогичные идеи для обеспечения быстрого доступа к объектам и снижения нагрузки на сервер для очень больших репозиториев.
technical/bundle-uri
теперь включает в свою справочную страницу :
Пример организации Bundle Provider
Этот пример организации представляет собой упрощенную модель того, что используется кэш-серверами GVFS (см. раздел в конце этого документа), которые помогают ускорить клонирование и выборку для очень больших репозиториев, хотя и используют дополнительное программное обеспечение вне Git.
Поставщик пакетов развертывает серверы в нескольких регионах.
Каждый сервер управляет своим набором пакетов.Сервер может отслеживать несколько репозиториев Git, но предоставляет список пакетов для каждого на основе шаблона.
Например, при зеркалировании репозитория в
https://<domain>/<org>/<repo>
сервер комплектов может иметь свой список комплектов, доступный по адресуhttps://<server-url>/<domain>/<org>/<repo>
.
Исходный сервер Git может перечислить все эти серверы в режиме «любой»:[bundle] version = 1 mode = any [bundle "eastus"] uri = https://eastus.example.com/<domain>/<org>/<repo> [bundle "europe"] uri = https://europe.example.com/<domain>/<org>/<repo> [bundle "apac"] uri = https://apac.example.com/<domain>/<org>/<repo>
Этот «список списков» является статическим и изменяется только при добавлении или удалении сервера пакетов.
Сервер пакетов запускает регулярно запланированные обновления для списка пакетов, например, один раз в день.
Во время этой задачи сервер извлекает последнее содержимое с исходного сервера и создает пакет, содержащий объекты, доступные из последних исходных ссылок, но не содержащиеся в предварительно рассчитанном пакете.
Этот пакет добавляется в список с учетом того, что он строго больше предыдущего максимума.creationToken
.Здесь приведен пример списка пакетов, хотя в нем только два ежедневных пакета, а не полный список из 30:
[bundle] version = 1 mode = all heuristic = creationToken [bundle "2022-02-13-1644770820-daily"] uri = https://eastus.example.com/<domain>/<org>/<repo>/2022-02-09-1644770820-daily.bundle creationToken = 1644770820 [bundle "2022-02-09-1644442601-daily"] uri = https://eastus.example.com/<domain>/<org>/<repo>/2022-02-09-1644442601-daily.bundle creationToken = 1644442601 [bundle "2022-02-02-1643842562"] uri = https://eastus.example.com/<domain>/<org>/<repo>/2022-02-02-1643842562.bundle creationToken = 1643842562
Намерение этой организации данных преследует две основные цели.
Во-первых, первоначальные клоны репозитория становятся быстрее за счет загрузки предварительно вычисленных данных объекта из более близкого источника.
Во-вторых, команды могут выполняться быстрее, особенно если клиент не получал запросы несколько дней. Однако если клиент не выполняет выборку в течение 30 дней, организация списка пакетов может привести к повторной загрузке большого объема данных объекта.
Это реализовано (все еще с Git 2.38 (3 квартал 2022 г.)): "" ().
См. коммит 65da938 (23 августа 2022 г.) и коммит e21e663, коммит 59c1752, , коммит 53a5089, коммит b5624a4 (09 августа 2022 г.) .
(Объединено в коммите 68ef042, 1 сентября 2022 г.)
коммит 5556891: добавить опцию --bundle-uri
Рецензировал: Джош Стедмон
Подписал: Деррик Столи
Клонирование удаленного репозитория — одна из самых затратных операций в Git.
Сервер может тратить много процессорного времени на создание пак-файла по запросу клиента.
Объем данных может надолго забить сеть, а протокол Git не возобновим.
Для пользователей с плохим сетевым подключением или находящихся далеко от исходного сервера это может быть особенно болезненно.Добавить новую опцию '' к '' ( ) для загрузки клона из пакета.
Если пользователь знает о сервере пакетов, он может указать Git загрузить новый репозиторий с этими пакетами, прежде чем извлекать оставшиеся объекты с исходного сервера.
теперь включает в свою справочную страницу :
--bundle-uri=<uri>
Перед получением с удаленного устройства извлеките пакет из заданного
<uri>
и разделите данные в локальном репозитории.Рефы в бандле будут храниться под скрытым
refs/bundle/*
пространство имен.Этот вариант несовместим с
--depth
,--shallow-since
, и--shallow-exclude
Git 2.39 (4 квартал 2022 г.) определяет логические элементы "bundle list
", структура данных для их хранения в ядре, формат для их передачи и код для их анализа.
См. коммит 8628a84 , коммит 70334fc, коммит 89bd7fe, коммит , коммит c96060b , коммит 20c1e2a , коммит 738e524, коммит bff03c4, коммит 0634f71, коммит 23b6d00 (12 октября 2022 г.) .
См. коммит d796ced , коммит 9424e37 (12 октября 2022 г.) от .
См. коммит f677f62 (24 августа 2022 г.) .
(Объединено Тейлором Блау --
ttaylorr
-- в коммите d32dd8a, 30 октября 2022 г.)
c23f592: получить список пакетов
Подписал: Деррик Столи
Когда содержимое по заданному URI пакета не понимается как пакет (на основе проверки исходного контента), Git в настоящее время сдается и игнорирует этот контент.
Независимые поставщики пакетов могут захотеть разделить содержимое пакета на несколько пакетов, но при этом сделать их доступными из одного URI.Научите Git пытаться анализировать содержимое URI пакета как файл конфигурации Git, содержащий пары для списка пакетов.
Затем Git просматривает режим списка, чтобы увидеть, достаточно ли ЛЮБОГО отдельного пакета или требуются ВСЕ пакеты.
Содержимое выбранных URI загружается, и содержимое снова проверяется, создавая рекурсивный процесс.Чтобы защитить рекурсию от искаженного или вредоносного содержимого, ограничьте глубину рекурсии разумными четырьмя.
Это может быть преобразовано в сконфигурированное значение в будущем, если это необходимо.
Значение четыре в два раза выше ожидаемого полезного значения (список комплектов вряд ли будет указывать на другие списки комплектов).Чтобы проверить этот сценарий, создайте интересную топологию пакета, в которой три добавочных пакета создаются поверх одного полного пакета.
Используя фиксацию слияния, два средних пакета становятся «независимыми» в том смысле, что они не требуют друг друга, чтобы разделить себя.
Каждому из них нужен только базовый комплект.
Однако для пакета, содержащего фиксацию слияния, требуются оба средних пакета.
Это приводит к некоторым интересным решениям при разделении, особенно когда мы позже реализуем эвристику, которая продвигает загрузку пакетов до тех пор, пока не будут выполнены предварительные фиксации.
В Git 2.40 (1 квартал 2023 г.) продолжается реализация пакетных URI (часть 4).
См. коммит 876094a, коммит 12b0a14, , коммит 9ea5796, , коммит 1b759e0 (22 декабря 2022 г.) .
См. коммит 70b9c10, , коммит 0cfde74, коммит 8f788eb, коммит 8b8d9a2 (22 декабря 2022 г.) от Ævar Arnfjörð Bjarmason ()Ævar Arnfjörð Bjarmason (
avar
) .
(Объединено в коммите 0903d8b, 2 января 2023 г.)
коммит 7cce907
bundle-uri client
: добавить логическую настройкуСоавтор: Деррик Столи
Подпись: Эвар Арнфьорд Бьярмасон
Подпись: Деррик Столи
Еще не введенная поддержка клиента для bundle-uri всегда будет возвращаться к полному клону, но мы все же хотели бы иметь возможность полностью игнорировать объявление сервера bundle-uri.
Новый параметр конфигурации по умолчанию имеет значение «false», но пользователь может установить для него значение «true», чтобы включить проверку URI пакетов с исходного сервера Git с использованием протокола v2.
теперь включает в свою справочную страницу :
transfer.bundleURI
Когда
true
, локальные команды будут запрашивать информацию о пакетах с удаленного сервера (если объявлено) и загружать пакеты, прежде чем продолжить клонирование по протоколу Git.
По умолчаниюfalse
.
И:
коммит 738dc7d: служить
bundle.* keys
из конфигаПодписал: Деррик Столи
Реализуйте возможность протокола «bundle-uri» версии 2, заполнив
key=value
строки пакетов из локальной конфигурации Git.
Список комплектов предоставляется с ключей, начинающихся с «bundle.».
И:
коммит ebc3947
bundle-uri
: разрешить относительные URL-адреса в списках пакетовПодписал: Деррик Столи
Поставщики пакетов могут захотеть распределить эти данные по нескольким CDN.
Для этого может потребоваться изменение базового URI вплоть до доменного имени.
Если для всех пакетов требуется абсолютный URI в их 'uri
', то при каждой отправке в CDN потребуется изменить оглавление, чтобы оно соответствовало ожидаемому домену и точному местоположению в нем.Разрешить списку пакетов указывать относительный URI для пакетов .
Этот URI основан на том, откуда клиент получил список пакетов.
Для списка, указанного в команде протокола v2 'bundle-uri', удаленный URI Git является базовым URI.
В противном случае список пакетов был предоставлен из URI HTTP, не использующего протокол Git, и этот URI является базовым URI.
Это упрощает распространение данных пакета.
В Git 2.40 (1 квартал 2023 г.) в подсистему URI-пакета добавлена поддержка эвристики токена создания для облегчения добавочной выборки.
См. фиксацию 026df9e, фиксацию c429bed, фиксацию 7f0cc04 , фиксацию 0524ad3 , , фиксацию 7903efb, фиксацию 512fccf, фиксацию c93c3d2 , фиксацию 7bc73e7, , фиксацию (31 января 2023 г.) Деррика Столи ( фиксацию d9fd674e72171fДеррика Столи ()derrickstolee
)Derrick Stolee
)Деррика Столи ()Деррика Столи ()Деррика Столи () .
(Объединено Junio C Hamano -- --Junio C Hamano --
gitster
--Junio C Hamano -- --Junio C Hamano ()Junio C Hamano -- -- в коммите 4f59836, 15 февраля 2023 г.)
фиксацию 4074d3c
clone
: установите fetch.bundleURI, если это необходимоПодписал: Деррик Столи
Поставщики пакетов могут организовывать свои списки пакетов таким образом, чтобы улучшить добавочную выборку, а не только первоначальные клоны.
Тем не менее, им необходимо заявить, что они организовались с учетом этого, иначе клиент не будет рассчитывать на экономию времени, загружая пакеты после первоначального клонирования.
Это делается путем указания значения bundle.heuristic.Существует два типа списков пакетов: со статическим URI и те, которые объявляются с удаленного Git по протоколу v2.
Новое значение конфигурации fetch.bundleURI применяется к статическим URI пакета, которые не объявляются по протоколу v2.
Если пользователь указывает статический URI через ''(мужчина ), то Git может установить эту конфигурацию как напоминание на будущее ''(man) операции для проверки списка пакетов перед подключением к удаленным устройствам.Для списков, предоставляемых по протоколу v2, мы захотим использовать другой подход и создать свойство самого удаленного устройства, создав
remote.<id>.*
введите ключ конфигурации.
Это не реализовано в этом изменении.Более поздние изменения будут обновлены '
git fetch
', чтобы использовать эту опцию.
git config
теперь включает в свою справочную страницу :
В этом значении хранится URI для загрузки данных объекта Git из URI пакета перед выполнением добавочной выборки с исходного сервера Git.
Это похоже на то, как
--bundle-uri
вариант ведет себя вмужчинаgit clone
man.
git clone --bundle-uri
установитfetch.bundleURI
значение, если предоставленный URI пакета содержит список пакетов, организованный для добавочной выборки.