2

有时当我从主干合并项目时,即使我的版本和主干之间没有区别,一些文件也会出现修改(即,需要通过合并签入)。比较表明它们完全相同,即使空白没有不同。

  • 这怎么可能?它与 mergeinfo 有关吗?
  • 考虑到没有更改,不将这些文件签入我的分支有什么副作用...
  • 当我尝试合并回主干时会不会有麻烦?
4

2 回答 2

3

您可能会看到的其中一件事是报告在合并期间文件已更新,即使它没有更新。这可能是由于更新了svn:mergeinfo该文件或目录的属性。

通常,只有项目的根目录应该有一个svn:mergeinfo属性,因为您几乎应该总是从项目的根目录合并。但是,一些开发人员习惯于合并单个文件和目录,因为他们知道这些已被更改。svn:mergeinfo当开发人员这样做时,Subversion 开始使用他们自己的属性跟踪这些文件和目录的合并。

现在,当您进行合并时,svn:mergeinfo即使文件本身没有更改,所有这些属性也必须更新。毕竟,Subversion 仍然必须跟踪您是否进行了特定的合并,即使它不影响该文件,以便能够跟踪已合并和尚未合并的内容。

如果svn:mergeinfo是问题,请不要还原文件。否则,Subversion 只会一遍又一遍地重做无用的合并。您可以尝试svn:mergeinfo从该特定文件的主干和分支中删除 ,但请注意不要忘记合并的内容。

在 Subversion 中合并并不像应有的那样干净利落。Subversion 识别两种不同类型的合并:

  • 定期合并,您将主干中的工作合并到特定分支中。
  • 重新集成合并,其中分支上的工作被合并回主干。

需要重新集成概念,因为您的分支包含您从主干合并到分支的内容,并且在该分支上工作,而不是主干本身。您不希望合并到分支中的内容再次放置在主干中,因此重新集成功能仅将分支上的工作复制回主干(实际上是双向合并)。完成此操作后,您必须非常小心地再次合并回该分支。

为什么?:该分支上的所有更改都已合并到主干中,从而创建了新的主干修订。如果您执行一个新的 Subversion 主干到分支合并,Subversion 将看到由合并创建的新修订,并尝试将新修订包含的所有更改重新合并回分支。

要处理此问题,请使用--record-only合并选项将主干中的新修订合并回分支。现在,当您从主干合并回分支时,将不会考虑合并该新修订:

$ svn co $REPO/trunk
$ cd trunk
$ svn merge --reintegrate $REPO/branch/1.2    #Two-way Reintegrating branch 1.2 to trunk
$ svn commit -m"Reintegrate 1.2"
commit revision 12345

合并创建了修订版 12345。这必须只记录回分支,以便我们能够重用分支:

$ svn co $REPO/branch/1.2
$ cd 1.2
$ svn merge -c 12345 --record-only $REPO/trunk
$ svn commit -m"Mark Reintegrate Merge as completed"

回顾

  • 这怎么可能?它与mergeinfo有关吗?

是的,它确实。您也许可以svn:mergeinfo从主干和分支中删除该文件中的信息。但是,您需要小心。或者,您现在可以忽略它,因为您知道它没关系。

  • 考虑到没有更改,不将这些文件签入我的分支有什么副作用...

Subversion 将在下次合并时再次尝试合并,每次合并花费的时间越来越长,因为每次必须合并更多的修订。

  • 当我尝试合并回主干时会不会有麻烦?

当您从分支合并到主干时,您必须使用该--reintegrate参数来防止分支将更改重新合并回主干。重新整合合并仅使用双向合并。这基本上使主干与分支匹配。

完成此操作后,您必须小心从主干到分支的新合并。

于 2014-02-11T20:47:41.903 回答
1

大卫在与“Merge-Hell”有关的麻烦的大多数(不是全部)方面都是正确的。但我想对一些具体细节做一些补充说明

  1. 当您执行普通差异时,您可以仅比较内容(并且某些差异可能会由于设置而错过一些更改 - fe EOL 样式更改,如果此更改在 /mostly GUI/diff-viewers 中被忽略)
  2. 存储库中的每个对象不仅可以包含内容,还可以作为非内容数据的容器(阅读 svn:properties,svn:mergeinfo 只是一个最明显的示例,但每个文件都可以包含更多自定义属性),它们也合并(替换,更新)在合并过程中。在合并后(提交前)svn diff 修改的工作副本中将显示WC 中的所有svn diff更改,两个节点之间(合并集和合并源)也将显示所有这些细节 - 试试看
  3. 当您执行子树合并(仅合并嵌套树上的部分)并稍后执行完全合并(即您分支 /A/B/C 文件时,由于某些原因仅合并 C 文件,然后对 /A/B/C 重复-file,最后一次合并删除合并信息,包含在 C 文件中)
于 2014-02-12T08:01:24.003 回答