svn merge from trunk



有时,当我从trunk合并项目时,一些文件会显示为已修改(即,需要在合并时签入),即使我的版本和trunk之间没有差异。比较显示它们完全相同,即使空白也没有什么不同。

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

您可能看到的一件事是,报告称文件在合并过程中被更新了,尽管它没有更新。这可能是由于更新了该文件或目录上的svn:mergeinfo属性。

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

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

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

Subversion中的合并并不像它应该的那样干净。Subversion识别两种不同类型的合并:

  • 常规合并,将主干中的工作合并到特定分支中
  • 重新整合合并将分支上的工作合并回主干中

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

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

要处理此问题,请使用merge的--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只需在下次合并时再次尝试合并,每次合并的时间越来越长,因为每次必须合并更多的修订。

  • 当我试图合并回trunk时会有麻烦吗

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

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

David在与"合并地狱"有关的大多数(并非所有)问题方面都是正确的。但我想进一步了解一些具体细节

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

相关内容

  • 没有找到相关文章

最新更新