在svn下维持两个非常接近但独立的开发线?

Ash*_*ary 5 svn version-control release-management

我们在svn下有我们的项目,一切都很顺利.最近,一位主要客户要求我们为他们做一些非常具体的定制,需要编码和填充(无法使用配置或部署完成).我们决定维持两个独立的发展路线:

  • 该trunk分支是部署为普通客户提供标准版
  • 该arsh分支机构面向该客户,并且正在进行持续开发,与之不同trunk

现在的事情arsh应该是计数地接收更新trunk,有时候实现的功能arsh是有用的trunk.这种关系有点双向,但一个方向非常普遍(从)trunk到另一个方向arsh是偶然的.

最好的方法是什么?工作流程 ?最佳做法?见解?

编辑:我们使用PHP 5.3,MySQL,Apache和Linux.

Jan*_*dec 3

最佳实践?#ifdef(或者通过运行时配置或任何其他编译时或运行时条件有条件地包含或有条件地依赖注入的同一接口的单独实现)!

在任何版本控制系统中,将并行版本维护为分支都是痛苦的。并行版本最好使用适当的条件编译或运行时配置技术来维护。

请记住,如果将分支 A 合并到分支 B,然后将分支 B 合并回分支 A,则两个分支将完全相同。这是三向合并的固有属性。这正是您想要的功能分支,但完全不适合为不同客户维护并行版本。

要为不同客户保留版本,请使用条件编译。

  • 在面向对象的代码中,您通常可以拥有具有通用逻辑的基类和每个变体的自定义派生类,其中仅包含特定于该变体的逻辑,该变体有条件地包含在项目中或有条件地实例化。
  • 大多数编程语言都支持某种形式的条件编译,但 Java 是一个值得注意的例外。

这种方法允许每个人始终立即检查他们没有破坏任一变体的任何功能,无论是通过对所有变体运行测试还是由持续集成服务器构建和测试所有变体。

你提到了PHP。那里没有编译步骤,因此配置只是运行时的。我可能会创建一个包含特定于客户的覆盖的目录,该覆盖将有条件地包含在适当的模板中。

注意:我目前正在开发一个 C++ 项目,该项目以这种方式为 20 多个客户定制,并且扩展得很好。我们没有为每个客户提供确切的代码,而是有一组可选的功能,并且不同的子集被运送给不同的客户。这使得测试所有功能变得更容易,因为我们可以构建一个最大变体并对其进行测试。当您发展到大量功能时,这会有所帮助,特别是如果您的项目需要很长时间来构建(我们的持续集成构建运行大约一个小时,每晚构建 8 小时,构建所有客户变体需要一整天以上的时间)。