cvs2svn和合并信息

时间:2009-03-10 23:46:11

标签: svn cvs cvs2svn

我想使用cvs2svn将CVS项目转换为Subversion。它有一个主干(HEAD),有几个从干线创建的临时开发分支。

在我们转换之前,我们会将来自主干的最新更改合并到所有开发分支中。但是他们还会有一些尚未合并回主干的变化。

当我将项目转换为SVN时,它将没有任何合并历史属性。那么如何初始化这些属性,以便随后可以与分支进行合并?

换句话说,在转换之后,主干和任何给定分支之间将存在许多差异。下次我从主干合并到分支时,我不希望将这些差异视为需要合并的更改。但是,当我从分支合并到主干时,我做到了。这可能吗?

更新:我接受了mhagger的建议,并告诉SVN,分支已经从主干中合并了所有更改:

svn co [branch URL] .
svn merge --record-only [trunk URL]
svn commit -m ''

这样可行,所以下次我尝试从主干合并到分支时,它没有显示新的变化。

但是我仍然遇到--reintegrate合并的问题,从分支回到主干。它最终显示了很多“R”替代文件,这意味着主干有一个文件X,而分支有一个文件X,但它们不被认为是同一个文件。这使合并变得混乱,虽然它似乎最终得到了正确的结果。

我认为这是因为以下一系列事件:

  • 分支已创建(在CVS中)
  • 文件X已添加到主干(在CVS中)
  • X合并到分支(也在CVS中)
  • 项目已转换为Subversion
  • Subversion不知道分支/ X是从trunk / X复制的。所以 认为这是替代品。

SVN历史记录如下所示:

r100: create branch (copied from trunk)
r200: add trunk/X
r300: add branch/X (because of a CVS merge, but it's not a SVN copy)

那么,有没有办法让我告诉Subversion忽略文件' 进行--reintegrate合并时的祖先?或者更好的方法来转换这些文件?

2 个答案:

答案 0 :(得分:1)

您可能知道,cvs2svn不生成任何合并元数据,除了有关分支从哪里发芽的隐式信息。 (它不能,因为CVS不会记录此类信息。)因此,在转换之后,您必须明确告诉Subversion有关在CVS下完成的合并。

最简单的方法是使用“svn merge --record-only ...”,如the Subversion book中所述。

答案 1 :(得分:0)

好的,我想我上面有关于--reintegrate问题的解决方法,万一有人感兴趣。

根据this document,如果我已将最新版本的主干合并到分支中,那么执行--reintegrate与执行此操作基本相同:

svn merge [trunk URL] [branch URL]

但是这种语法允许--ignore-ancestry,而--reintegrate则不允许。所以我可以这样做:

svn merge --ignore-ancestry [trunk URL] [branch URL]

这显示了与--reintegrate相同的结果,没有所有“R”替代文件。唯一的区别似乎是mergeinfo属性。我不确定这些是否正确,所以最好在之后删除分支,就像你在--reintegrate之后那样。