9

先说一点背景:

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

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

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

我面临的问题:我不知道是否有一种好方法可以让代码同时与两个存储库同步。也就是说,我想保留“远程”版本信息(以便我可以在将来的更改中合并),但我也想同时拥有“本地”版本信息(即,在同一个目录结构中) .

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

有没有办法在颠覆中做到这一点?或者您对解决此问题的替代方法有建议吗?

4

2 回答 2

6

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

为了合并颠覆更改,我在本地 git 副本中有 2 个遥控器 - “本地开发”来源和“来自颠覆镜像”的来源。每当我觉得需要时,我可以将颠覆镜像中的更改合并到我们的开发树中。本地更改不受影响,它们分开并且不会弄乱 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
于 2008-11-26T14:19:43.047 回答
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 是第二次合并时的头版本。你看到了模式。此外,在发出命令时,您必须位于本地结帐的基本目录中,这一点很重要。

于 2008-11-26T14:01:18.340 回答