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 mime 类型

使用 cvs2svn 时,如何重命名符号以使分支和标记解析为相同的名称?

如何在单个 gremlin 查询中将两个顶点详细信息和边属性详细信息合并在一起

cvs2svn 迁移

cvs2svn 2.3.0 在第 16 阶段崩溃

Magento:合并产品描述和添加信息选项卡