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



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



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



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



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

475   2  

2 ответов:

связки!

рабочий процесс с Git bundle будет по существу таким же, как и любой другой рабочий процесс. Это может показаться не очень полезным советом, но вот он: используйте любой рабочий процесс, который вы обычно используете, и замените "push/pull" на "carry a bundle here to there on a flash drive, then 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'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

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

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

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

РЕПО на флешке

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

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

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

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

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

оба: скопируйте myBundleName.пакет (с помощью электронной почты, USB, что угодно)

сзади: (поместите файл myBundName.пакет в любом месте вы хотите за пределами папку проекта)

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

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

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

(OPTIONAL) 4. BEHIND: git push

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

Comments

    Ничего не найдено.