我想使用 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 合并时?或者有更好的方法来转换这些文件?

有帮助吗?

解决方案 2

好的,我想我有一个解决上述 --reintegrate 问题的方法,以防有人感兴趣。

根据 这个文件, ,如果我已将最新版本的主干合并到分支中,则执行 --reintegrate 与对主干执行此操作本质上相同:

svn merge [trunk URL] [branch URL]

但此语法允许 --ignore-ancestry,而 --reintegrate 则不允许。所以我可以这样做:

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

这向我显示了与 --reintegrate 相同的结果,没有所有“R”替换的文件。唯一的其他区别似乎是 mergeinfo 属性。我不确定这些是否正确,因此最好之后删除分支,就像 --reintegrate 之后一样。

其他提示

您可能知道,cvs2svn 不会生成任何合并元数据,除了有关分支从何处萌芽的隐式信息。(它不能,因为 CVS 不记录此类信息。)因此,转换后,您必须明确告知 Subversion 有关在 CVS 下完成的合并。

最简单的方法是使用“svn merge --record-only ...“,如中所述 颠覆书.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top