Как синхронизировать два репозитория 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
так что в конечном итоге ветви и теги одинаковы на двух машинах.