svn - 在 svn 下保持两条非常接近但独立的开发线?

标签 svn version-control release-management

我们的项目在 svn 下,一切进展顺利。最近一个大客户要求我们为他们做一些非常具体的定制,这些定制需要编码和东​​西(不能使用配置或部署来完成)。我们决定维持两条独立的发展路线:

  • trunk分支是我们部署的标准版本
    普通客户
  • arsh分支是针对这个客户的,并且正在与 trunk 中正在发生的事情分开进行开发。

  • 现在是 arsh应该每年收到来自 trunk 的更新有时在 arsh 中实现的功能在 trunk 中很有用.这种关系是双向的,但一个方向非常普遍(从 trunkarsh ),而另一个方向是偶尔的。

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

    编辑:我们使用 PHP 5.3、MySQL、Apache 和 Linux。

    最佳答案

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

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

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

    为了为不同的客户保留版本,请改用条件编译。

  • 在面向对象的代码中,您通常可以拥有具有通用逻辑的基类和具有特定于该变体的逻辑的每个变体自定义派生类,这些逻辑要么有条件地包含在项目中,要么有条件地实例化。
  • 大多数编程语言都支持某种形式的条件编译,Java 是一个明显的异常(exception)。

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

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

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

    关于svn - 在 svn 下保持两条非常接近但独立的开发线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340277/

    相关文章:

    svn - 如何找到给定 subversion 工作副本的根文件夹

    git - 你在现实世界中如何使用 GIT?

    SVN 开发和发布流程 - 健全性检查

    tfs - 我们可以从 TFS 生成发行说明吗

    java - IDE 中的 Release模式与 Debug模式

    eclipse - 从 Eclipse 使用 SVN 创建分支和标签时出错

    svn - 如何查看乌龟 svn 中提交之间的区别?

    git - 版本控制系统是否使用差异来存储二进制文件?

    git - 丢失最后的 Git 提交

    git - p4 命令相当于 git/hg/bzr/svn status 之类的命令是什么? (提示: not `p4 status` )