版本控制“最佳实践”

时间:2009-09-07 16:33:19

标签: cvs branch

我一直在阅读有关版本控制主题的所有问题,但我认为我没有找到一个看起来像我自己的场景。

场景是:

我们有一个中型/大型Web应用程序,它(至少应该有)一个部署到所有客户端的核心。当我们向客户端演示应用程序时,几乎所有应用程序都要求更改布局,列表中的数据或数据输入表单中的字段等等......几乎所有这些更改都需要更改剩余的“应用程序层。

在我们目前的情况下,我们使用CVS(使用tortoiseCVS)并且我们不使用分支,我们使用标签来区分代码更改与应用程序(是的,我知道它非常糟糕)。当我们想要向特定客户发布版本和签入更改等时,这会带来很多问题....准备版本总是需要大约1-2天的工作,有时它仍然会中断。

有时,来自客户端的请求也会包含在核心中,以便分发给所有客户端。

所以我的问题是:分支机构是将更改隔离到应用程序的自定义客户端版本的最佳方法吗?每当新客户要求定制时我们应该分支吗?或者我们应该将它视为一个完全不同的项目,使用不同的存储库?

所有不同的版本都必须维护,因为我听说分支是“临时的”我怀疑分支是否是最好的解决方案。

感谢您的回复。

Antonio Dias

6 个答案:

答案 0 :(得分:4)

我不知道为什么你认为分支是临时的 - 只要你愿意,它们就会存在。

您的应用程序听起来好像可以通过重组来实现更多模块化功能,但与此同时,您可以将主要功能开发为主干,每个客户版本都成为自己的分支。

然后可以根据需要将对核心代码的修改合并到每个分支中。客户特定的更改可以在该分支上单独进行,也可以在以后合并回到主干。

每个客户的单独存储库听起来完全是错误的事情,因为它会导致存储库之间的公共代码重复。

答案 1 :(得分:4)

首先,您可能最好咬掉子弹并重构代码以减少所有这些自定义的影响。有很好的模式允许这种类型的场景(配置驱动,插件,软件工厂浮现在脑海中)。

话虽如此,如果应用程序与您描述的一样(每个客户端都需要对核心进行广泛的更改),您可能想要探索使用编译器指令来隔离单个客户端更改是否比分支更适合您。分支的问题(我确定你发现)是一个分支中的修复通常需要传播到所有其他分支(因为你以后从未打算合并分支)。此外,您可能需要修复在一个客户端上运行的生产版本,同时仍然在该客户端的下一个版本上进行开发...分支的一个分支。

如果在添加新客户端时继续使用每个客户端分支策略,事情就会变得更糟。

答案 2 :(得分:3)

据我所知,你一直在做的不是版本控制应该做什么。它仅用于跟踪您的源代码,而不是您的分布式产品。关于分支机构的问题,我认为这个小解释可能有所帮助:   - trunk是项目的主要开发,这是所有团队成员合作的地方   - 分支是临时开发的地方(是的,你听到了它)。这是您可以在不影响其他团队成员的情况下进行实验或搞乱代码的地方   - 标签只不过是“命名快照”。在版本控制项目中,快照无处不在,标记是您可以为其提供更易读的名称的方式 如果你试图通过处理它们来获得越来越多的分支机构,那么你的项目将会永远增长和发展。我仍然想知道为什么你必须跟踪所有这些。 我可以再一次重复一遍,版本控制仅用于合作源代码,而不是分发给多个客户。 希望有所帮助

答案 3 :(得分:2)

Feature Branching is a poor man's modular architecture, instead of building systems with the ability to easy swap in and out features at runtime/deploytime they couple themselves to the source control providing this mechanism through manual merging. 

- Dan Bodart - 通过Martin Fowler

版本控制不是正确的工具,因为您希望使用它来管理版本,而不是客户。

答案 4 :(得分:1)

首先,拥抱分支并学习如何正确使用版本控制系统。

我参与了一个项目,他们尝试通过标签按照您描述的方式管理版本。根据标签手动添加/合并更改然后应用新标记是某人的工作。这使得每个人都很难保持同步,并且由于简单的错误(遗忘的文件,踩踏变化等)几乎总是导致破坏的构建。 您基本上是手动执行分支机构为您做的事情

至于如何管理不同的客户端自定义。除了为每个客户端版本管理分支策略之外,您还应该了解架构并思考如何管理自定义/差异。

是否有可能打破组件并拥有子项目?一些核心区域可能不会经常更改,并且可能会添加到构建中(类似于第三方罐)。

或者您可以进行基本构建/安装,然后对自定义进行分层。覆盖自定义文件和/或修改基本文件。

答案 5 :(得分:0)

Branches 用于隔离无法在同一当前分支机构中完成的“开发工作”(此处为某些自定义)。
由于标记旨在引用“不可变”的内容,因此您不应该对其进行任何改进。一个简单的:

 cvs tag -r MY_TAG -b MY_BRANCH

足以从分支标记初始化分支。

从当前开发开始,应该为每个UAT(用户验收测试)周期完成这些分支。然后你可以:

  • 尝试将先前为客户演示的分支的内容合并到此新分支
  • 或直接在新分支中重新实现自定义。
  • 在UAT循环完成后保留那些分支。它们不会被修改,但可以作为下一个循环的下一个分支的参考。

尝试维护一个具有自定义功能的分支比在一个新分支中重新创建所述进化要困难:这需要在当前长期分支中合并当前开发,并且您的开发很可能会引入更多代码的复杂变化,而不是您为客户演示所做的演变。