托管版本的项目组织

时间:2015-02-04 15:49:46

标签: git refactoring organization code-organization

我们开始重构一个支持大约30个客户端的中型HMVC Web应用程序。目前,代码由SVN存储库中的单个分支管理。有时,更改是特定于客户端的,有时,更改将适用于所有客户端。我们是唯一处理来源的人。

每个客户端都需要大量的自定义,从业务逻辑到显示,但所有工作基本相同,所有客户共享具有与client_id列区分的特定公司信息的数据库表这一事实。

围绕新代码的组织有两个想法,我很难总结各方法之间的差异以及每个方法的优缺点。任何帮助更好地理解这一点将不胜感激。

1)将每个应用程序功能放在自己的git存储库中。为所有应用程序功能创建接口,以管理这些部分之间的依赖关系。使用Composer(一个PHP包管理器)管理这些应用程序组件,以便客户端包含一个包清单,其中包含其所有组件和该组件的版本。如果单个应用程序需要更改模块,请通过分叉该模块来创建新的包/存储库。如果更改跨多个模块,则创建多个新存储库,将它们作为composer包发布,然后将新包添加到客户端清单。

2)为整个应用程序创建一个git存储库。为每个客户端创建一个fork(或分支)。对于客户端特定的更改,请使用fork。要更改所有客户端,请使用主存储库,并根据需要将上游存储库合并到客户端存储库中。

哪种方法可为开发团队提供长期可管理性和灵活性?有另一种方法可以考虑吗?就目前而言,由于分层系统和多年的滥用,很难同时进行客户特定的更改和系统范围的更改。

2 个答案:

答案 0 :(得分:2)

第一种方法类似于组件方法I detailed here

不同之处在于您正在使用php Composer,这意味着您不需要像我通常建议的那样依赖git submodule,因为Composer FAQ表明:

  

将通过git安装的依赖项添加到git repo会将其显示为 submodules
  这是有问题的,因为它们不是真正的子模块,你会遇到问题。

可能仍然需要Git子模块(在非父级仓库中管理一组更改),但由于Composer不支持它们,您可以在“How do I use a Git submodule with a Composer loaded library?”中查看答案。

方法1在长期可管理性和灵活性方面仍然是更好的方法,但最初可能需要大量的重新架构工作。

答案 1 :(得分:2)

另一种方法可以是使用 gitflow

正如你在#2中所指出的,它将允许你拥有几个" master" &安培; "释放"每个客户的分支机构,同时它将足够灵活,可以为您的所有"客户添加您的修复程序,功能等等。这实际上是这个模型中的分支。

第二个选项是使用子模块/子树,但每个子模块都是一个完全不同的存储库(如#1建议中所述)