Как синхронизировать два репозитория git

У меня есть два репозитория git на разных компьютерах. У меня есть несколько местных отделений на каждом из них. Я не хочу отправлять эти ветки на удаленный сервер, просто держу их локально. Как я могу синхронизировать без использования сети? Могу ли я просто заархивировать репозиторий на одном ПК и перейти на другой? Это безопасно? Может быть, я могу экспортировать как-то новейшие изменения из каждой ветки?

4 ответа

Решение

Вместо того, чтобы делать чистый клон, я предпочитаю делать пакет (см. " Как я могу послать кому-нибудь по электронной почте репозиторий git?"), Который генерирует один файл, который легче скопировать (например, на USB-накопитель)

Бонус в том, что у него есть некоторые характеристики голого репо: вы можете вытащить его или клонировать.
Но нужно беспокоиться только об одном файле.

machineB$ git clone /home/me/tmp/file.bundle R2

Это определит пульт под названием "origin"в результирующем репозитории, который позволяет вам получать и извлекать из пакета. $GIT_DIR/config файл в R2 будет иметь такую ​​запись:

[remote "origin"]
    url = /home/me/tmp/file.bundle
    fetch = refs/heads/*:refs/remotes/origin/*

Чтобы обновить полученный репозиторий mine.git, вы можете получить или извлечь его после замены пакета, хранящегося в /home/me/tmp/file.bundle с добавочными обновлениями.

Поработав еще немного в исходном репозитории, вы можете создать инкрементный пакет для обновления другого репозитория:

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

Затем вы переносите пакет на другой компьютер для замены /home/me/tmp/file.bundleи вытащить из него.

machineB$ cd R2
machineB$ git pull

Смотрите этот пост в блоге "Синхронизация Git-репозиториев без сервера" (автор Виктор Костан).

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

Начните с создания репозитория на USB-накопителе.

mkdir /path/to/usb/stick/repository.git
git clone --local --bare . /path/to/usb/stick/repository.git

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

git remote add usb file:///path/to/usb/stick/repository.git
git push usb master

В будущем вы можете обращаться с USB-хранилищем как с любым другим удаленным хранилищем. Просто убедитесь, что он смонтирован:) Например, следующие изменения вносят новые изменения в USB-репозиторий.

git push usb

На принимающей стороне подключите USB-накопитель и используйте URL-адрес файла для хранилища.

file:///path/to/usb/stick/repository.git

Несколько удобных команд:

# cloning the repository on the USB stick
git clone file:///path/to/usb/stick/repository.git
# updating a repository cloned from the USB stick using the above command
git pull origin
# adding the USB stick repository as a remote for an existing repository
git remote add usb file:///path/to/usb/stick/repository.git
# updating from a remote repository configured using the above command
git pull usb master

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

Т.е. чтобы объединить repo2 со второго компьютера в ~/repo1, сначала скопируйте repo2 в файловую систему repo1 в ~/repo2 (карта памяти, сетевая копия и т. Д.), А затем вы можете использовать ответ для Git, извлекая изменения между двумя локальными репозиториями.:

~/repo1 $ git remote add repo2 ~/repo2
~/repo1 $ git fetch repo2
~/repo1 $ git merge repo2/foo

Это работает, потому что, как говорится в статье в Википедии о git: "Репозиторий Git - данные и метаданные - полностью содержится в своем каталоге, поэтому обычная копия (или переименование, или удаление) всего системного уровня - безопасная операция Полученная копия не зависит от оригинала и не знает о нем."

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

Если я сделаю

git remote -v

Я получаю такую ​​информацию

USB_F   file:///f/Git_repositories/projectname.git (fetch)
USB_F   file:///f/Git_repositories/projectname.git (push)
USB_G   file:///g/Git_repositories/projectname.git (fetch)
USB_G   file:///g/Git_repositories/projectname.git (push)

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

Затем я запускаю скрипт с таким содержимым

cd /path/to/projectname

if [ -d /f/Git_repositories/projectname.git ] 
then
    git push USB_F --all
    git push USB_F --tags
fi
if [ -d /g/Git_repositories/projectname.git ] 
then
    git push USB_G --all
    git push USB_G --tags
fi

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

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

Команды push -all и push --tags выполняют эту синхронизацию, гарантируя, что все ветви и теги помещаются в USB-хранилище, даже новые, о которых USB-хранилище не было известно. Там нет по умолчанию, чтобы освоить или необходимости знать имена филиалов и обрабатывать их по одному.

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

Еще одна вещь, которая довольно очевидна, но о которой я не упомянул, это то, что для синхронизации ПК A и ПК B вам необходимо

1. sync PC A and the USB device
2. sync PC B and the USB device
3. sync PC A and the USB device again!

Или смотреть по-другому, иди

PC A -> USB -> PC B
PC B -> USB -> PC A

так что в конечном итоге ветви и теги одинаковы на двух машинах.

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