Контроль исходного кода: несколько репозиториев для одного проекта - PullRequest
6 голосов
/ 05 марта 2009

Возможно ли иметь несколько репозиториев для одного проекта?

В настоящее время я использую SVN с TortoiseSVN с репозиториями на внешнем жестком диске у меня дома, а также с точки зрения резервного копирования, это не идеально.

Итак, я имею в виду создание аккаунта с развертывание и наличие второго (мой домашний - первый) репозитория, куда я могу сделать коммит там (даже для решение для удаленного резервного копирования).

Теперь, конечно, я хочу целостности в своем коде и не хочу расхождений между двумя (или более?) Репозиториями, что означает, что оба репозитория должны быть обновлены, когда я фиксирую свой код.

Так что я могу сделать, чтобы это произошло?

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

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 05 марта 2009

Все возможно :)

РЕДАКТИРОВАТЬ : поспешность никогда не приводит к качеству, и мой ответ не пропал, пропуская все ссылки на Windows в вопросе. Итак, здесь приведен краткий обзор того, как заставить синхронизацию работать в Windows.

У вас есть 2 машины в этом случае:

  • Машина A: где работает хранилище Теперь.
  • Машина B: где вы хотели бы синхронизировать с.

Создайте новый репозиторий на B, который вы хотите синхронизировать с A. Очень важно, чтобы этот репозиторий был пустым (работает на rev0).

На B в папке SVN недавно созданного репозитория перейдите к / hooks и создайте следующие BAT-файлы:

старт-commit.bat

IF "%2" == "someusername" (goto :label1) else (echo "Only the someusername account may commit new revisions" >&2 )

exit 1
goto :eof

:label1
exit 0

предварительно revprop-change.bat

IF "%3" == "someuser" (goto :label1) else (echo "Only the someuser user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

someuser являющийся синхронизатором, который существует в репозитории компьютера A и является единственным пользователем с правами в репозитории компьютера B. Очень важно, чтобы никакие коммиты не выполнялись вручную в хранилище машины B.

В папке /hooks репозитория на компьютере A

после commit.bat

CD PATH_TO_SUBVERSION\bin
svnsync sync svn://machineB/repos --non-interactive --no-auth-cache --source-username machineAusername --source-password machineApassword --sync-username machineBusername --sync-password machineBpassword

Как только эти пакетные файлы будут созданы, нам нужно сообщить репозиторию на B, что мы хотим синхронизироваться с ним:

svnsync initialize svn:// machineB /repos svn:// machineA /repos --non-interactive --no-auth-cache --source-username machineAusername --source-password machineApassword --sync-username machineBusername --sync-password machineBpassword

, который должен возвращать что-то вроде: Copied properties for revision 0.

Теперь каждый раз, когда вы фиксируете в хранилище на машине A, оно будет копироваться в хранилище машины B.

Очень важно отметить, что если вы хотите синхронизироваться с Google Code или другим онлайн-репозиторием, чтобы они передали структуру ствола / ветвей / тегов в ревизию 1. Вы должны связаться с ними, чтобы сбросить репозиторий. если вы хотите использовать расположение стороннего хранилища в качестве хранилища синхронизации.

Чтобы отдать должное, я скопировал pre-revprop-change.bat и start-commit.bat из http://www.svnforum.org/2017/viewtopic.php?t=5745&sid=06551a22d9c0b5780cf1faab6b0e8ce9

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

РЕДАКТИРОВАТЬ 2:

Если у вас, как и у меня, есть тонны репозиториев, этот общий post-commit.bat может вам понравиться:

SET REPOS=%1
SET REV=%2
SET REPOS=%REPOS:D:\SVN=%

CD "C:\Program Files\Subversion\bin"

svnsync sync svn://machineB/%REPOS%-sync --non-interactive --no-auth-cache --source-username usernameA --source-password passwordA --sync-username usernameB --sync-password passwordB

Это ловит имя репозитория и использует его для динамического определения URL-адреса синхронизации. Я добавил суффикс всех моих репозиториев синхронизации на машине B с -sync для ясности. Бит D:\SVN является корнем svnserve на machineB , хотя этот универсальный BAT-файл должен быть помещен в / hooks machineA svnserve root.

1 голос
/ 06 марта 2009

Я не уверен, что полностью понял вашу проблему, но я думаю, что вы ищете svnsync .

Ваш основной репозиторий можно разместить на жестком диске вашего ноутбука, а зеркальный - на настольном / домашнем сервере.

Просто зафиксируйте свои изменения в основном хранилище и затем синхронизируйте его с вашим зеркальным хранилищем (ями). Этот процесс является инкрементным, поэтому передаются только ревизии с момента последней синхронизации, но будьте осторожны с неверсионными свойствами.

Также вы можете взглянуть на здесь и здесь .

0 голосов
/ 06 марта 2009

С точки зрения чистого SVN, у вас может быть только одна папка .svn, которая указывает только на 1 репо в вашей рабочей папке.

Вы можете использовать post-commit-hooks в своем репозитории svn, чтобы попытаться синхронизировать оба репозитория ... но на самом деле у вас просто неправильный инструмент, если вы этого хотите.

Проблема, которую вы описываете, лежит в основе распределенной системы контроля версий, такой как GIT. Что позволяет делать коммиты локально, а также отправлять его в удаленный репозиторий.

Вы могли бы даже использовать GIT локально и SVN в качестве удаленного репо, если бы вы были так склонны.

  • см. GIT для инструмента
  • см. GitHub для бесплатного публичного хостинга
...