Как использовать git-bundle для синхронизации разработки? - PullRequest
66 голосов
/ 03 сентября 2010

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

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

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

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

Ответы [ 2 ]

109 голосов
/ 03 сентября 2010

Связка!

Рабочий процесс с 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 использует теги, всегда обновленные с последними ссылками, которые были перенесены на другой хост. Я просто использовал удаленные ветви, которые будут ссылаться на последние ссылки, переданные с другого хоста. Это немного неэффективно; в итоге вы получите больше, чем нужно, так как это на шаг позади. Но флешки большие, пакеты маленькие, и использование ссылок, которые у вас уже есть, вместо того, чтобы делать дополнительный шаг и быть осторожным с тегами, экономит много усилий.

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

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

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

8 голосов
/ 14 октября 2012

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

Это все еще немного сложно, поэтому вот самый простой случай синхронизации один раз (в моем случае: ОТ: ноутбук в автономном режиме со сломанной картой 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.

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