Как использовать git-bundle для синхронизации разработки?

Мне нужно синхронизировать деревья разработки на разных компьютерах без сетевого соединения между ними.

У нас есть центральное хранилище git, и я обычно работаю над своим собственным клоном на своем офисном компьютере. Иногда мне нужно заняться разработкой на другом компьютере, который никогда не подключен к офисной сети. Ни один из компьютеров никогда не подключен к Интернету. Разработка может выполняться на обоих компьютерах между синхронизациями.

Я прочитал страницы справки для git-bundle, который кажется лучшим инструментом, но я не совсем уверен, как можно настроить хороший рабочий процесс.

Можете ли вы дать мне несколько советов или указателей?

2 ответа

Решение

Связки!

Рабочий процесс с git bundle будет практически таким же, как и любой другой рабочий процесс. Это может показаться не очень полезным советом, но вот оно: используйте любой рабочий процесс, который вы обычно используете, и замените "push/pull" на "перенесите пакет сюда на флэш-накопитель, а затем потяните".

На этой странице руководства есть довольно хорошее пошаговое руководство, хотя это скорее односторонний пример. Для полноты, вот немного измененная версия, показывающая, как перемещать информацию в обе стороны:

# on hostA, the initial home of the repo
hostA$ git bundle create hostA.bundle --branches --tags

# transfer the bundle to hostB, and continue:
hostB$ git clone /path/to/hostA.bundle my-repo
# you now have a clone, complete with remote branches and tags
# just to make it a little more obvious, rename the remote:
hostB$ git remote rename origin hostA

# make some commits on hostB; time to transfer back to hostA
# use the known master branch of hostA as a basis
hostB$ git bundle create hostB.bundle ^hostA/master --branches --tags

# copy the bundle back over to hostA and continue:
hostA$ git remote add hostB /path/to/hostB.bundle
# fetch all the refs from the remote (creating remote branches like hostB/master)
hostA$ git fetch hostB
# pull from hostB's master, for example
hostA$ git pull

# make some commits on hostA; time to transfer to hostB
# again, use the known master branch as a basis
hostA$ git bundle create hostA.bundle ^hostB/master --branches --tags
# copy the bundle to hostB, **replacing** the original bundle
# update all the refs
hostB$ git fetch hostA

# and so on and so on

Главное, на что нужно обратить внимание, это то, что вы можете добавить пакет как удаленный и взаимодействовать с ним так же, как и с любым другим удаленным. Чтобы обновить этот пульт, просто вставьте новый комплект, заменив предыдущий.

Я также использовал немного другой подход к выбору основы. Страница man использует теги, всегда обновленные с последними ссылками, которые были переданы другому хосту. Я просто использовал удаленные ветки, которые будут ссылаться на последние ссылки, переданные с другого хоста. Это немного неэффективно; в итоге вы получите больше, чем нужно, так как это на шаг позади. Но флешки большие, пакеты маленькие, и использование ссылок, которые у вас уже есть, вместо того, чтобы делать дополнительный шаг и быть осторожным с тегами, экономит много усилий.

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

Репо на флешке

Честно говоря, если ваш репо не очень большой, это может быть так же просто. Поместите голый клон на флеш-накопитель, и вы можете нажимать и извлекать его с обоих компьютеров. Рассматривайте это как ваше сетевое соединение. Нужно перевести в центральное репо? Подключи это!

Ответ @Jefromi был великолепен - в 10 раз лучше, чем у git docs, которые подробно рассказывают о непонятных требованиях и действиях.

Это все еще немного сложно, поэтому вот самый простой случай синхронизации один раз (в моем случае: ОТ: автономный ноутбук с сломанной картой Wi-Fi, TO: рабочий стол с сетевым доступом). Судя по ответу @ Jefromi, это работает нормально:

AHEAD = машина, которая впереди на некоторое количество коммитов. BEHIND = машина, на которую вы хотите скопировать коммиты

1. AHEAD: git-bundle create myBundleName.bundle --branches --tags

ОБА: скопируйте myBundleName.bundle (используя электронную почту, USB, что угодно)

ЗАД: (поместите файл myBundName.bundle в любое место за пределами папки проекта)

2. BEHIND: cd [the project folder]
3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master

Пока вы добавляете имя ветки в конце (по умолчанию, если вы не используете ветки, "master"), это, кажется, работает нормально и не заменяет никакие внутренние ссылки на BEHIND - так что вы все еще может синхронизироваться с / с оригинального мастера.

то есть, если у BEHIND есть доступ к интернету, это все равно безопасно:

(OPTIONAL) 4. BEHIND: git push

... и он обновит основной репозиторий, как если бы ваши изменения были сделаны локально, как обычно, в BEHIND.

Другие вопросы по тегам