代码之家  ›  专栏  ›  技术社区  ›  JW.

cvs2svn和合并信息

  •  1
  • JW.  · 技术社区  · 16 年前

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

    在转换之前,我们将把来自主干的最新更改合并到所有dev分支中。但它们也会有一些尚未合并回主干中的更改。

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

    换言之,在转换之后,主干和任何给定分支之间都会有一些差异。下次我从主干合并到分支时,我不希望将这些差异视为需要合并的更改。但当我从树枝合并到树干上的时候,我做到了。这有可能吗?

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

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

    这是可行的,所以下次我尝试从主干合并到分支时,它不会显示任何新的更改。

    但是我仍然有一个问题——重新整合合并,从分支到主干。最后会显示很多“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忽略这些文件? 做一个-重新整合合并时的祖先?或者更好的方法来转换这些文件?

    2 回复  |  直到 15 年前
        1
  •  1
  •   mhagger    16 年前

    正如您可能知道的,cvs2svn不会生成任何合并元数据,除了有关分支从何处开始的隐式信息。(它不能,因为cvs不记录这些信息。)因此,在转换之后,您必须明确地告诉Subversion有关在cvs下完成的合并。

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

        2
  •  0
  •   JW.    15 年前

    好吧,我想我有一个解决上述——重新整合问题的方法,以防有人感兴趣。

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

    svn merge [trunk URL] [branch URL]
    

    但是这个语法允许——忽略祖先,而——重新整合不允许。所以我可以这样做:

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

    这显示了与——重新集成相同的结果,没有所有“r”替换文件。唯一的区别似乎是mergeinfo属性。我不确定这些是否是正确的,所以最好在之后删除分支,就像在重新集成之后一样。