将代码与两个子版本库同步

9
首先,让我简单介绍一下背景:
  • 我正在使用来自远程 SVN 代码库的“基础”代码,该代码库不在我的控制范围内。该代码尚未被标记,因此我始终需要跟上主干。

  • 由于多种原因(最重要的原因是我们对代码的本地扩展具有“利基”性质,旨在解决在使用代码的项目中出现的特定问题),我无法使用远程代码库对我进行本地修改进行版本控制。

  • 我有一个本地 SVN 代码库,目前正在其中进行“本地”版本控制。

我面临的问题是:我无法确定是否有好的方法使代码同时与两个代码库同步。也就是说,我想保留“远程”版本信息(以便将来合并更改),但同时也想在相同的目录结构中拥有“本地”版本信息。
目前,我使用两个不同的目录来执行此操作,这两个目录都包含相同的代码,但每个目录都包含不同的版本控制信息。显然,这会增加很多开销,特别是因为两个目录中的代码需要独立同步。
在 Subversion 中有什么方法可以做到这一点吗?或者您对其他方法有什么建议?
2个回答

6

我使用 git svn 将开发工作放在了一个 git 仓库中,然后将远程开发工作放在了 subversion 中。我克隆了 subversion 仓库并使用 git push 推送到了一个真正的 git 仓库中,这样便可以创建一个 subversion 仓库的 git 镜像。定期运行 cronjob 命令 "git svn rebase && git push" ,以创建 subversion 仓库的 git 镜像。

为了合并 subversion 的更改,我在本地 git 代码中拥有两个远程版本——"local development"(本地开发)和"from subversion mirror"(来自 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

Git 看起来很不错。对我来说,似乎比 svn 更能做更多的事情。 - boutta
谢谢,这几乎就是我在寻找的。开始学习Git! - Alex
Boutta,svn有哪些git做不到的功能? - csexton
我遇到了类似的情况,需要同步两个svn仓库。我尝试了你的指示,但是我一直收到“bash: git-receive-pack: command not found”的错误提示。有什么想法吗? - Shoan
你在服务器上安装了git吗?已安装的bin目录是否在$PATH中?我使用的是git 1.6.0.2,也许自那以后git-receive-pack的名称已经更改了? - richq

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是第二次合并时的头部修订版本。您可以看到这个模式。此外,在发出命令时,重要的是您在本地检出的基本目录中。


这可能是一个更易于维护的替代方案,但仍需要“手动”版本管理...无论如何,感谢建议,在转向git之前,至少会尝试几天 :-) - Alex
如果两个SVN服务器都有1.5版本,则不再需要手动跟踪修订版本。但是,这仅适用于SVN 1.5。 - boutta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接