cvs2svn 和合并信息
Posted
技术标签:
【中文标题】cvs2svn 和合并信息【英文标题】:cvs2svn and merge info 【发布时间】:2009-03-10 23:46:10 【问题描述】:我想使用 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 不知道 branch/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 合并时的祖先?还是转换这些文件的更好方法?
【问题讨论】:
【参考方案1】:您可能知道,cvs2svn 不会生成任何合并元数据,除了关于分支从何处发芽的隐含信息。 (它不能,因为 CVS 不记录此类信息。)因此,在转换之后,您必须明确告诉 Subversion 有关在 CVS 下完成的合并。
最简单的方法是使用“svn merge --record-only ...
”,如the Subversion book 中所述。
【讨论】:
【参考方案2】:好的,我想我有一个解决上述 --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 之后一样。
【讨论】:
以上是关于cvs2svn 和合并信息的主要内容,如果未能解决你的问题,请参考以下文章
使用 cvs2svn 时,如何重命名符号以使分支和标记解析为相同的名称?