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

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

4 ответов


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

бонус заключается в том, что он имеет некоторые характеристики голого РЕПО: вы можете вытащить из него или клонировать его.
Но только нужно беспокоиться о один.

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

это определит удаленный под названием"origin " в результирующем репозитории, который позволяет извлекать и извлекать из пакета. The на R2 будет иметь такую строчку:

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

обновить результате шахты.git repository, вы можете получить или вытащить после замены пакета, хранящегося в /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 без сервера" (by Виктор 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

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

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

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

это работает, потому что as статья Википедии о git говорит: "репозиторий 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!

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

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

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