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

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

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

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

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

Ответы

Ответ 1

Связка!

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

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

# 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 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

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

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

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

Репо на флэш-накопителе

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

Ответ 2

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

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

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

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

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

BEHIND: (поместите файл 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.