синхронизировать между 2 репозиториями git - PullRequest
2 голосов
/ 05 апреля 2011

У меня есть 2 открытых хранилища.Они сделаны так:

ssh git@primary.com
git init --bare repo1
ssh git@backup.com
git clone --bare git@primary.com:repo1

Один используется для разработки (назовем его primary ), а другой используется для резервного копирования (в случае, если первый недоступен).Можно ли автоматически синхронизировать их - что-то вроде git pull при резервном копировании.

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

ssh git@backup.com
rm repo1 -fr
git clone -- bare git@primary.com:repo1

Конечно, когда основной сервер некоторое время был недоступен, и я использовал резервное копирование, я бы хотел обновить основной.*

Также добавление 2 удаленных пультов в рабочий репозиторий является решением, но вы должны постоянно подталкивать их обоих, что не может произойти, если один из них недоступен.

Все конфликты разрешаются врепозитории non-bare

edit зачем мне резервное хранилище:

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

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Вы можете использовать git push --mirror other-remote для зеркалирования всех ссылок из одного репозитория в другой. Это не будет отражать конфигурацию репозитория или тайники, хотя вы можете также посмотреть ответы на этот вопрос:


Обновление: В ответ на ваш уточненный вопрос и комментарий ниже, я должен сказать, что git push --mirror небезопасно в обоих направлениях, поскольку git push --mirror делает принудительное обновление ссылок и удаляет удаленные ссылки . Например, предположим, что ваш master на primary опережает его на backup и есть новая ветвь на primary, которая еще не была отражена - тогда git push --mirror сбросит ветвь master на primary в старое состояние и удалить только что созданную ветку.

Кроме того, даже если вы отражаете только от primary до backup, небезопасно разрешать людям нажимать на backup, поскольку все новое, добавленное только туда, будет удалено следующим зеркалом.

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

0 голосов
/ 05 апреля 2011

Используйте скрипт crontab или аналогичный для регулярного запуска git push --mirror remote для вашей резервной копии. Вы также можете добавить зацепку фиксации, чтобы автоматически принудительно отправлять обновления на другой пульт, таким образом, у вас нет «окна сбоя». Не нужно обновлять из резервной копии, так как она, вероятно, никогда не будет иметь своего нового или обновленного контента.

...