Subversion Merge:如何干净地重新整合“确定”分支?

时间:2009-05-11 22:00:46

标签: svn

我们一直在尝试使用新技术来管理我们的发布分支。

通常,我们会在主干上维护当前版本,并为每个版本创建发布分支。发布分支是通常发生活动开发的地方,主干用于当前版本的错误修复。

我们定期将来自主干的错误修复程序合并到发布分支(每周)。

现在我们已准备好进行另一次发布,我们希望将发布分支合并到主干中。不幸的是,这会导致许多冲突(> 50)。起初我很惊讶,但现在我明白Subversion无法通过主干中存在的内容轻松纠正分支中的变化。

有没有办法告诉Subversion在集成回主干时使用分支中的所有文件版本?我们知道文件的分支版本是“正确的”。

作为替代方案,理论上我们可以放弃主干并从分支机构开始工作 - 从分支机构分支发布。

我们使用TortoiseSVN和Subclipse。

4 个答案:

答案 0 :(得分:11)

来自svn help merge的输出:

  

- 接受 ARG

     

指定自动冲突解决操作   ('推迟','基地','我的冲突','他们的冲突','我的充满',   '他们 - 完整','编辑','发布')

要在合并到主干时接受分支更改,您需要“--accept theirs-full”选项。

我不认为TortoiseSVN 1.6.2在GUI中有相同的选项。在合并期间遇到每个冲突时,您仍可以interactively resolve conflicts选择“use repository”。

答案 1 :(得分:6)

我相信您通过将错误修复从主干复制到发布分支的方式有时称为rebasing。在这种情况下,所有的重新定位意味着你选择一个通常基于主干的修订版r49的分支,并将从主干的r50-r57的变化合并到分支中,以便后面的单词你现在可以认为该分支是基于修订的行李箱的r57而不是修订版r49。

实践中的问题是,当将一系列修订从主干或任何其他基础合并到其中一个分支时,它不会重置创建该分支的基本修订,而是保留正常{{3属性是了解已合并内容的唯一方法。为了能够将更改从分支重新集成到它的基础(例如主干)而不会无意中重放合并的基础更改,请参阅我之前的示例中的r50-r57,将樱桃的分支更改合并到基础选择特定修订版本的方式是不包括由重新定位引起的任何修订(从基础到分支合并)。

不幸的是,除了它之外,Subversion开发人员还要实现一种自动化方法,以便只包含不包含mergeinfo属性的修订版本,该属性描述的合并只包含原始基本修订版本和目标修订版本之间的修订版本基地(通常是HEAD)。这变得更加复杂,因为合并通常包括手动更改,这些更改将随着分支上的合并提交一起提交而丢失,并且任何给定对象的来源都必须跟踪到它的共同祖先才能使其工作正确地在mergeinfo分支上。除此之外,一个允许分支被更新的基本或主干副本替换的功能,所有先前的提交都作为一系列单独的提交重新应用,这也会使这成为可能,但是笨拙的行为更像是真正的变形

这些评论不是一个明确的答案,但代表了我作为长期Subversion用户的理解。如果任何人有任何其他要点可以添加或者可以在我的陈述中找出可能不正确的内容,请通过各种方式让我知道,以便我们能够真正了解当前Subversion实现的功能和局限性。

更新:根据Subversion文档,当使用staircased时,Subversion应该能够以一种可以考虑任何可能的刷新合并的方式正确地重新集成在分支中完成的工作可能已经完成将基础更改带入分支。当然,这在技术上与变基有点不同,但我认为它在使用上足够相似,可以称之为变基。现在的主要问题是--reintegrate选项是否有效当来自基础的更改已经以一种挑选的方式合并到主干中,而不是合并从BASE + NEXT到HEAD的所有内容。

更新:在使用Subversion 1.5及更高版本的svn merge - reintegrate 选项时,似乎--reintegrate option。遵循这些说明应该允许您重新集成,而不会因重新引入rebase更改修订而导致无意义的冲突。

有关详细信息,请阅读标题为cherry picking should be supported

部分下的Subversion手册。

答案 2 :(得分:0)

也许我在这里遗漏了一些东西,但听起来最简单的选择就是删除trunk并通过从你的新发布分支分支来重新创建它。

答案 3 :(得分:0)

理论上,你可以从树干的头部到树枝的头部“合并两棵不同的树木”。 避免因重新整合而产生任何奇怪的冲突。

相关问题