SVN:为每个客户设立分行会有什么问题吗?

SVN: Would there be any problems having a branch for each customer?

我们有一个定制的 CMS 和许多想要用它构建网站的客户。解决方案结构是这样的:

Libs
- Lib1
- Lib2
- etc
Plugins
- Plugin1
- Plugin2
- etc
MVC Web Project

MVC Web 项目包含管理主题、站点的布局和资产等...其中的大部分内容对于每个客户都是相同的 - 只有少数文件会更改(主要是与主题相关的内容,配置文件等)。如果我们每次都必须将项目复制到不同的 SVN 存储库中,那将是一种浪费和维护的噩梦。

我以前从未使用过 SVN 分支和合并,但我理解这个概念。虽然我想做的事情可能有点奇怪......让我解释一下:

我注意到 SVN 创建 "cheap copy" 个分支 - 因此它不会复制每个文件。我正在考虑做这样的事情:

trunk
- code for main project
branches
- Customer1's Project
- Customer2's Project
- then some real dev branches of course
tags
- Version 1 (Generic Demo Project)
- Version 2 (Generic Demo Project)
- etc

我的想法是为每个客户建立一个分支,其中只有少数文件发生更改,我希望在发生更改时可以轻松地将主干中的最新代码合并到每个客户分支。

我猜这不正常,但可行吗?有人看到这有什么潜在问题吗?

My idea is to have a branch for each customer

我在很多公司都看到过这种情况。

从未见过一家公司很高兴他们这样做了。


考虑一下...当您获得更多客户时会发生什么?维护代码库的复杂性 呈指数级增长 。每当您进行更改时,都必须将其合并多次。任何时候你修复一个错误,你都必须重新合并并重新测试很多次。而且您必须手动跟踪哪些更改已提升到哪些客户分支机构。 非常, 非常 tempting/easy 做一个"quick hot fix" 对于特定客户,因为他们大声抱怨它,然后几乎立即忘记它。

那么测试呢? QA 是否准备好单独重新测试每个分支?因为这正是 this 导致的地方。 (另一种方法是测试一个分支,合并到另一个分支,并假设它有效。发布与测试代码库不同的代码库通常不是一个好主意。)

这个烂摊子变大了


I noted that SVN creates "cheap copy" branches - so it doesn't make copies of every single file.

在此考虑过程中忽略该事实。磁盘 space 并不昂贵。如果您增加维护复杂性只是为了节省几个字节的磁盘 space 那么,在业务层面,您所做的决定反映了企业及其员工的时间不如硬盘有价值。这对企业来说是一个非常糟糕的地方。


most of what's in there will be the same for every customer - only a few files will change (mostly theme related stuff, config files and the like)

非常好。那么朝着能够管理这一点迈出的一大步就是准确地定义什么是特定于客户的,并将其与非特定客户区分开来。在理想情况下,可以在单个配置文件中定义特定于客户的东西(也被认为是特定于环境或特定于部署的)。 可能比这更复杂,但这是您的目标。

您一定要避免特定于客户的 代码。相同的代码库应该满足每个客户,定制应该在该代码库之外定义。这样就可以测试和验证一个代码库。

客户特定的配置可以存储在源代码管理中,通常与代码库并行并作为 build/deploy 场景的一部分包含在内。那里不需要分支机构,每个客户都可以在一些自定义文件夹中拥有自己的文件夹。添加新客户只是简单地添加一个新的配置文件夹,最坏的情况是,在 preparing/packaging 系统运送时,向 build/deploy 脚本添加一个新的 case 语句以从该文件夹中获取。


分支用于(在我看来经常被过度使用)偏离代码库,而不是部署目标。 (尽管有些系统确实有 "dev" 分支和 "prod" 分支之类的东西。从技术上讲,这些是部署目标。这实际上用作显式快照机制,而不是真正的分支机制。)