我想使用cvs2svn将CVS项目转换为Subversion。它有一个主干(HEAD),有几个从干线创建的临时开发分支。
在我们转换之前,我们会将来自主干的最新更改合并到所有开发分支中。但是他们还会有一些尚未合并回主干的变化。
当我将项目转换为SVN时,它将没有任何合并历史属性。那么如何初始化这些属性,以便随后可以与分支进行合并?
换句话说,在转换之后,主干和任何给定分支之间将存在许多差异。下次我从主干合并到分支时,我不希望将这些差异视为需要合并的更改。但是,当我从分支合并到主干时,我做到了。这可能吗?
更新:我接受了mhagger的建议,并告诉SVN,分支已经从主干中合并了所有更改:
svn co [branch URL] .
svn merge --record-only [trunk URL]
svn commit -m ''
这样可行,所以下次我尝试从主干合并到分支时,它没有显示新的变化。
但是我仍然遇到--reintegrate合并的问题,从分支回到主干。它最终显示了很多“R”替代文件,这意味着主干有一个文件X,而分支有一个文件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合并时的祖先?或者更好的方法来转换这些文件?
答案 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之后那样。