将代码与两个subversion存储库同步

时间:2008-11-26 13:55:59

标签: svn version-control synchronization

首先是背景:

  • 我正在使用来自远程SVN存储库的“基本”代码,而不是我的控制。代码没有标记(但),所以我总是需要跟上主干。

  • 出于多种原因(最重要的是我们对代码的本地扩展具有“利基”性质,并且旨在解决使用代码的项目的特定问题)我可以不要使用远程存储库对我在本地进行的任何修改进行版本控制。

  • 我有一个本地SVN存储库,我正在进行“本地”版本控制。

我遇到的问题:我无法弄清楚是否有一种很好的方法让代码同时与两个存储库同步。也就是说,我想保留“远程”版本信息(以便我可以在将来的更改中合并),但我也希望同时拥有“本地”版本信息(即,在相同的目录结构中)

目前,我正在使用两个不同的目录执行此操作,这两个目录都包含相同的代码,但每个目录包含不同的版本控制信息。显然这是一个相当大的开销,特别是因为两个目录中的代码需要独立同步。

有没有办法在颠覆中做到这一点?或者您是否有其他方法可以解决这个问题?

2 个答案:

答案 0 :(得分:6)

我是使用git svn完成的,我的开发是在git存储库中完成的。远程开发是在颠覆中完成的。我制作了一个subversion存储库的git svn克隆,我推送到一个真正的git存储库。 cronjob不时运行“git svn rebase&& git push”来创建subversion repo的git镜像。

为了合并subversion更改,我在本地git副本中有2个遥控器 - “本地开发”源和“来自subversion镜像”的来源。只要我觉得有需要,我就可以将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

答案 1 :(得分:3)

您可以将本地存储库放在提交更改的位置,就像您已经完成的那样。此外,您将从基本存储库执行定期合并,以便将基本主干中完成的更改合并到本地存储库中。

唯一困难的是,您需要跟踪已从基础存储库合并的修订版。

这可能是这样的:

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是第二次合并时的头版本。你看到了模式。此外,在发出命令时,您必须位于本地结帐的基本目录中。