Синхронизация кода с двумя хранилищами Subversion - PullRequest
9 голосов
/ 26 ноября 2008

Сначала немного фона:

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 26 ноября 2008

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

Чтобы объединить изменения Subversion, у меня есть 2 пульта в моей локальной копии git - источник "local development" и источник "from subversion mirror". Всякий раз, когда я чувствую необходимость, я могу объединить изменения из зеркала 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
3 голосов
/ 26 ноября 2008

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

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

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

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 - ревизия головы в момент второго слияния. Вы видите образец. Кроме того, при выдаче команд важно, чтобы вы находились в базовом каталоге вашей локальной кассы.

...