Синхронизация кода с двумя репозиториями Subversion

Сначала немного предыстории:

  • Я использую "базовый" код из удаленного репозитория SVN, который не находится под моим контролем. Код не помечен (пока), поэтому мне всегда нужно идти в ногу со стволом.

  • По ряду причин (наиболее важной из которых является то, что наши локальные расширения кода имеют «нишевый» характер и предназначены для решения конкретной проблемы с проектом, в котором используется код), я не могу использовать удаленный репозиторий. для контроля версий любых изменений, которые я вношу локально.

  • У меня есть локальный репозиторий SVN, в котором я в настоящее время занимаюсь «локальным» управлением версиями.

Проблема, с которой я столкнулся: я не могу понять, есть ли хороший способ синхронизировать код одновременно с обоими репозиториями. То есть я хотел бы сохранить информацию об «удаленной» версии (чтобы я мог объединить в будущем изменения), но я также хотел бы иметь информацию о «локальной» версии одновременно (т. Е. В той же структуре каталогов) .

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

Есть ли способ сделать это в Subversion? Или у вас есть предложения по поводу альтернативных подходов к этому?


person Alex    schedule 26.11.2008    source источник


Ответы (2)


Я сделал это с помощью git svn, при этом моя разработка велась в репозитории git. Удаленная разработка выполняется в Subversion. Я сделал git svn клон репозитория Subversion, который помещаю в настоящий репозиторий git. Cronjob время от времени запускает "git svn rebase && git push", чтобы создать git-зеркало репозитория Subversion.

Чтобы объединить изменения подрывной деятельности, у меня есть 2 пульта дистанционного управления в моей локальной копии git - источник "локальной разработки" и источник "из зеркала субверсии". Когда я чувствую необходимость, я могу слить изменения из зеркала Subversion в наше дерево разработки. На локальные изменения это не влияет, они живут отдельно и не портят зеркало svn.

Я использовал gitosis для настройки и администрирования репозиториев git. Шаги будут примерно такими (по памяти, может и не так):

# set up the mirror
git svn clone -s $SVN
git remote add origin git@$MACHINE:svnmirror.git
git push
# + cron job to do git svn rebase && git push every N hours/minutes

# set up the local working copy for development
git clone git://$MACHINE/svnmirror.git
# that's an anonymous, read only clone 
# no push to the svn mirror for developers - only cronjob user can push there
git remote add newproject git@$MACHINE:myproject.git
git push newproject
# now do the real deal
git clone git://$MACHINE/myproject.git
# hack hack hack
git push # origin master not needed
git remote add svnmirror git://$MACHINE/svnmirror.git
git merge svnmirror/master
git push
person richq    schedule 26.11.2008
comment
Git выглядит впечатляюще. Мне кажется, вы могли бы сделать гораздо больше, чем с svn. - person boutta; 26.11.2008
comment
Спасибо, это почти именно то, что я искал. Поехали изучать мерзавец! - person Alex; 27.11.2008
comment
Boutta, что может svn делать, что git не может? - person csexton; 28.11.2008
comment
Я застрял в аналогичной ситуации, когда мне нужно синхронизировать два репозитория svn. Я пробовал ваши инструкции, но постоянно получаю bash: git-receive-pack: команда не найдена. Любые идеи? - person Shoan; 15.09.2009
comment
Вы установили git на сервере? Находится ли установленный каталог bin в вашем $ PATH? Я использую это с git 1.6.0.2, возможно, с тех пор git-receive-pack изменил имена? - person richq; 15.09.2009

У вас может быть локальный репозиторий, в котором вы фиксируете свои изменения, как вы это уже сделали. Далее вы должны делать периодическое слияние из базового репозитория, чтобы объединить изменения, сделанные в базовом стволе, в ваш локальный репозиторий.

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

Это могло выглядеть так:

svn merge -r X:Y baseRepositoryURL // merge from base repo
svn commit                         // commit the changes to local repo
svn merge -r Y:Z baseRepositoryURL // merge from base repo
svn commit                         // commit the changes to local repo

Где X - это ревизия вашей первоначальной проверки, Y - это головная ревизия во время первого слияния, а Z - это основная ревизия во время второго слияния. Вы видите закономерность. Кроме того, при выполнении команд важно, чтобы вы находились в базовом каталоге вашей локальной кассы.

person boutta    schedule 26.11.2008
comment
Это, вероятно, более легкая альтернатива тому, что я делаю сейчас, но все же требует ручного управления версиями ... В любом случае, спасибо за предложение, я попробую хотя бы пару дней, прежде чем прибегать к git :-) - person Alex; 27.11.2008
comment
Если оба сервера SVN имеют версию 1.5, ручное отслеживание изменений больше не требуется. Но только под SVN 1.5 - person boutta; 27.11.2008