Имитация 'git pull' для системы с воздушным зазором путем передачи наборов изменений git в виде tarball - PullRequest
1 голос
/ 08 апреля 2019

Мне нужно синхронизировать репозитории git с системой с воздушным зазором, создающей в системе зеркальную среду.Файлы должны быть переданы через специальный одобренный канал.Новый код также должен пройти длительный процесс проверки и утверждения, прежде чем быть допущенным в систему.

Код развивается быстро, и я хочу выполнять еженедельную синхронизацию отдельных веток - как будто я просто выполняю git pull,Повторная передача всего git-репо на самом деле не вариант.Намного легче очистить наш обзор и утверждение, чтобы просмотреть только различия кода.

Есть ли способ использовать пакет, архив или diff-дерево или что-то подобное, чтобы выгрузить только новые наборы изменений в файл и выполнитьgit pull / fetch из этого файла в системе с воздушным зазором для обновления репозиториев?

Я просмотрел документацию по исправлениям, архивам, деревьям различий и предыдущим ответам, но я не думаю, что что-то из этогопредоставляет именно то, что мне нужно.

1 Ответ

4 голосов
/ 08 апреля 2019

Git не работает и не хранит различия. Git работает и сохраняет коммиты (которые, в свою очередь, хранят деревья и большие двоичные объекты) и теги (которые обычно метят коммиты, которые хранят деревья и большие двоичные объекты).

Тем не менее, git bundle - это команда, которую вы ищете: по сути, это половина серверной части git fetch, а ее вывод - это файл, который git fetch на стороне клиента может прочитать , Таким образом, вы относитесь к машине, которая производит пакет, как к серверу: вы сообщаете ему, какие коммиты уже есть у клиента, и какие имена филиалов, по вашему мнению, должен видеть клиент, когда он получает выборку, которую клиент еще не получил на самом деле бежать. Затем сервер (создающий пакет) упаковывает те же данные, которые получит git fetch, если позднее git fetch действительно сможет достичь сервера.

Затем вы вручную переносите данные (например, на флешку) на клиент, подключаете их к клиенту и на клиенте запускаете git fetch для файла данных, который, насколько клиент является что касается того, что теперь он в режиме реального времени получает данные по проводам с сервера, расположенного внутри файла (например, внутри USB-накопителя).

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

machineA$ cd R1
machineA$ git bundle create file.bundle master
machineA$ git tag -f lastR2bundle master

Теперь вы передаете file.bundle «клиенту» и можете клонировать из этого файла.

Позже, после machineA новых коммитов, вы можете запустить:

machineA$ cd R1
machineA$ git bundle create file.bundle lastR2bundle..master
machineA$ git tag -f lastR2bundle master

чтобы (а) отправлять новые коммиты клиенту и (б) обновлять в памяти на сервере то, что коммиты вы отправили клиенту. (Фактическая отправка, конечно же, происходит позже, через USB-накопитель или что-то еще.)

Этот маркер на самом деле является любым произвольным хеш-идентификатором фиксации, или именем, которое служит как единое целое, или чем-то еще, чтобы установить «базовый коммит (-ы)», который сервер предположит, что клиент уже имеет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...