Синхронизация репозиториев на разных хостах

34

Я думаю о запуске небольшого проекта и хочу создать его версию с помощью git.

Bitbucket кажется хорошим вариантом для меня с их бесплатным планом. Я хочу использовать его в качестве основного инструмента для работы с git, поскольку у них есть хорошие инструменты, такие как веб-интерфейс, клиент Mac OS и так далее. Но чтобы иметь более высокую защиту от случайных повреждений, которые могут быть вызваны использованием сторонних сервисов, я также хочу установить git на свой NAS в качестве второй резервной копии хранилища.

Теперь мой вопрос: возможно ли создать репозиторий на двух разных хостах и ​​затем синхронизировать их? Например, предположим, что раз в неделю я обновляю репозиторий на своем NAS, чтобы он соответствовал репозиторию на Bitbucket. Затем, в случае, если что-то случится с Bitbucket, у меня все еще будет полный репозиторий с полной историей разработки на моем локальном хранилище NAS.

И есть ли способ импортировать существующее хранилище с полной историей в другой git-сервис?


Я думаю, что зеркалирование - это то, что мне нужно. Эта статья, кажется, описывает именно то, что мне нужно. И это один , а также.

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

Я прав?

BartoNaz
источник
я использую xpdev мне интересно, в вашей ситуации 2 системы, что было бы bennefit от использования мерзавца в вашем случае. просто чтобы быть уверенным, что из каждой финальной сборки я делаю резервную копию USB. Но в основном управление версиями выполняется в xpdev, поэтому это не является реальным требованием. Кстати, если у вас есть надежный NASS Raid1 или около того, вы можете подумать о запуске своих собственных систем управления версиями, есть также некоторые бесплатные
user613326
Но я хочу, чтобы полная версия была доступна в 2 местах. Если сторонний хостинг умирает или компания, управляющая им, просто исчезает, я хочу иметь точно такой же опыт со всей историей версий ...
BartoNaz
Это означает, что у меня будет Bitbucket для комфорта и GIT на NAS для безопасности 99,9%.
BartoNaz
Что касается xp-dev, то вряд ли такая компания умрет, они могут изменить планы хостинга кода, цены и т. Д. Или слиться с другой компанией. Но для них это молочный город. И они также сделают резервную копию ценных данных. Это их дело, чтобы остаться на месте. Я использую его с 3 разработчиками, и наш код существует на 5 разных машинах, где всегда есть локальная исходная копия, которая синхронизируется в xp dev. XP dev бесплатен, если у вас есть только несколько проектов.
user613326
1
Конечно, это маловероятно. Но тем не менее, вы никогда не можете быть на 100% уверены ...
BartoNaz

Ответы:

19

Да, в этом и заключается прелесть DVCS, например, git. Вы можете использовать любое количество разных репозиториев с тем же состоянием, что и на bitbucket или github.

Даже ваша локальная копия (хранилище на вашем компьютере) обычно является полным клоном удаленного хранилища.

Единственное, что вам нужно сделать, чтобы синхронизировать несколько репозиториев, - это потянуть за одно (обычно называемое origin или upstream) и отправить в резервные копии.

Уилберт
источник
11
К сожалению, все не так блестяще. См. Предостережение о приближении к катастрофе в KDE . То есть, убедитесь, что резервная копия не удаляет вещи (ветки, репозитории и т. Д.), Которые были удалены на резервном сервере.
Ян Худек
Я все еще не уверен, правильно ли я понимаю. Насколько я понимаю, push и pull работают с определенной версией. Но допустим, у меня есть последняя версия кода на моей рабочей машине. У меня есть репозиторий git на удаленном хосте (Bitbucket, Github или что-то еще), у которого есть полная история разработки кода вплоть до самой последней версии, которую я имею на рабочей машине (если она была зафиксирована). И у меня есть хранилище на NAS, которое пусто. Могу ли я импортировать полную историю кода с удаленного хоста на свой NAS, чтобы у меня было два одинаковых репозитория в двух местах, и как?
BartoNaz
2
Клонируйте удаленный репозиторий, затем регулярно извлекайте в него все обновления (все ветви). Git-клон содержит историю, это не похоже на svn checkout, который имеет только последнюю версию.
Уилберт
11

Вот проверенное решение проблемы: Автоматические Sync 2 Remote Git Repositories

Простой скрипт для синхронизации 2-х удаленных репозиториев Git

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

Что должен делать такой скрипт?

Ну, в общем, шаги для этого просты: 1. Клонировать первый репозиторий 1. Добавить второй в качестве дополнительного удаленного репозитория 1. Извлечь все, что есть во втором репозитории 1. Вставить обновленный локальный репозиторий в 2 удаленные репозитории.

Остается вопрос - каковы правильные ключи для всех вышеперечисленных команд git?

Так что вот оно ...

2repos-sync.sh GISP скрипт

# Clear the folder first - please use this carefully
rm -rf $REPO_NAME  
# clone the reposotory
git clone --bare $ORIGIN_URL

# add a remote repository
cd $REPO_NAME
git remote add --mirror=fetch repo1 $REPO1_URL

# update the local copy from the first repository
git fetch origin --tags

# update the local copy with the second repository
git fetch repo1 --tags

# sync back the 2 repositories
git push origin --all
git push origin --tags
git push repo1 --all
git push repo1 --tags

ВНИМАНИЕ - этот скрипт не разрешает случаи конфликтов между содержимым репозитория!

yorammi
источник
Вы можете упомянуть в своем ответе, что первое, что вы делаете, это удаляете существующий локальный каталог с $ REPO_NAME. Это кажется важным и может предотвратить потерю данных для людей, которые просто копируют ваше решение.
Уилберт
Для этого LibGit2 полезен для такого рода вещей.
RubberDuck
0

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

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

Это позволяет мне рассматривать GitHub как еще один удаленный модуль, с которого я могу извлекать информацию, когда кто-то вносит свой вклад, а затем я объединяю --no-ff локально, и возникает поток, с помощью которого все мои основные и публичные репозитории распределяют изменения.

diffalot
источник