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

jon*_*ohn 13 svn

我们一直在尝试一种新技术来管理我们的发布分支.

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

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

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

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

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

我们使用TortoiseSVN和Subclipse.

Wim*_*nen 11

从输出svn help merge:

- 接受 ARG

指定自动冲突解决行动('推迟','基地','我的冲突','他们的冲突','我的全部','他们的'充分','编辑','发起')

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

我不认为TortoiseSVN 1.6.2在GUI中有相同的选项.在合并期间遇到每个冲突时,您仍然可以通过选择" "以交互方式解决冲突use repository.


jpi*_*son 6

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

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

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

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

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

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

有关更多信息,请阅读标题为" 保持分支同步 " 节中的Subversion一书.