Как синхронизировать два репозитория git - PullRequest
34 голосов
/ 01 февраля 2011

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

Ответы [ 4 ]

25 голосов
/ 01 февраля 2011

Вместо создания чистого клона я предпочитаю создать связку (см. " Как я могу отправить кому-нибудь по электронной почте репозиторий 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
22 голосов
/ 01 февраля 2011

См. это сообщение в блоге "Синхронизация репозиториев Git без сервера" ( Victor Costan ).

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

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

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

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

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
5 голосов
/ 16 января 2013

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

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

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

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

0 голосов
/ 07 августа 2015

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

Если я делаю

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

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

...