【问题标题】:cvs2svn and merge infocvs2svn 和合并信息
【发布时间】: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 合并时的祖先?还是转换这些文件的更好方法?

【问题讨论】:

    标签: svn cvs cvs2svn


    【解决方案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 之后一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 2012-05-11
        • 2015-02-03
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        相关资源
        最近更新 更多