目前我们使用Subversion进行源代码控制,但我们发布的所有合并工作都是手动完成的.我们每年发布几次,因此为每个版本创建一个分支.来自早期分支的所有工作必须使其成为后来的分支.后期分支机构的工作不得进入较早的分支机构(这在我们的合同中).我相信这被称为促销模式.
我认为下面的图表最能说明我们所需的工作流程,每当新版本开始工作时都会创建分支,并且从早期分支流向后来的分支.
| 1 | |\ | \ | 2 3 | |\| 4 | | |\ 5 | \ | 6 | | | 7 |\|\| | |\| 8 9 |\ | | | \ |\| | 10 x |\| | | |\| | | | a b c d
编辑 - 添加更多信息.
传统的不稳定中继线模型可能不适合的原因如下图所示.每个版本的功能不一定按发布顺序完成(某些客户可能很难确认要求).我们希望尽快将更改从早期分支传播到后一分支.
a | 1 | b|\ a | \ | 2 3 | | | 4 | b/|c | / 5 | | | 6 7 | | b c a
在这种情况下,我们希望在分支b中使用特征2(在分支a中完成),但由于这是子到父合并,因此Subversion不支持,因此必须手动完成.类似地,特征6必须手动合并两次.与自动跟踪的合并相比,我预计这是一个相对缓慢且容易出错的过程.
如果我了解您的情况,您的要求中没有任何内容会使事情变得像您看起来那样复杂。您还过于强调自动合并与手动合并的优点(稍后会详细介绍)。CVS 分支将是另一回事,但与 SVN 处理“分支”的方式不同(即,它没有)。
您可以拥有一条主要(不稳定或稳定)开发线,并为每个客户或版本(或两者)创建分支。当功能经过验证时,它们要么合并回主线,以便后续分支可以包含这些更改,要么您始终从父分支单向合并。没有什么需要您关闭分支,并且合并的自动化程度不亚于支持您的第一个(混乱的)图表(假设您有多个并发开发线)。
仅向前合并的要求听起来就像您只需要合并主线中的子集修订版、给定分支修订版之后的修订版。通过这种方式进行合并,您可以根据需要将任意分支的更改合并回主线(因为它们已与您的客户确认),并且可以放心地向前应用,因为只有经过验证的更改才会被应用。您可以设置自动合并来跟踪该副本修订(请参阅 --stop-on-copy 和基于范围的合并)。然后,发布分支会选取从给定点开始发生的一组已确认的更改。
SVN 不“跟踪合并”,就像它不支持分支一样(它不支持,它们只是轻量级副本)。您告诉它(或 svnmerge 告诉它)要合并的范围,它会应用这些更改。无论如何,您都可以获得合同要求支持的效果。
回答您提出的问题:
我认为你提出的模型不是很有效。相反,它增加了功能跟踪混乱的可能性,因为您可能必须扫描分支以查找更改并多次向前合并。而且,这无疑会让熟悉 SVN 和更传统的 SVN 组织结构的开发人员感到困惑。
当然。这也应该完全独立于您选择的结构。无论如何,您将需要/想要跟踪您的修订点(更糟糕的是可能通过一些简单的脚本编写)。
当然。分支机构在服务器端的 SVN 中实际上没有任何成本。如果您进行整个根结帐,客户端就会产生成本,但这通常是一件愚蠢的事情。同样,忽略/删除分支也没有问题。这只是对全局修订层次结构的另一个更改,就像任何其他复制/删除/重命名/等一样。
无论采用何种“分支”组织结构,这都应该有效。听起来好像对 SVN 中的“分支”的含义有一点误解。无论如何,您应该能够设置您想要的内容并相对轻松地执行“手动”合并,然后在几次客户更新后设置自动合并,以便您可以更好地理解合并步骤。
干杯!