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