我正在编写一个软件,我即将发布它的三个版本,Lite版本,专业版和企业版。
这三个版本有一些共同的功能,但是,每个版本都有一些功能,其他版本中没有。如下图所示:
要管理这些版本,我有两种方法(使用git):
1:为公共功能创建分支,为每个版本创建另一个分支。然后在需要时将公共分支合并到每个版本中。
2:为公共功能创建存储库,并将其分成三个其他版本的存储库。然后在需要时将主要仓库(上游)的共同特征拉入每个版本的仓库。
我想知道哪种方法更好,或者是否有更好的方法(使用或不使用git)来实现结果。
更新 不幸的是,这个软件最初是由其他人编写的,它缺乏结构。它过于耦合,很可能,除非从头开始编写,否则不可能将其分解为更小的模块。
答案 0 :(得分:1)
你的两种方法听起来都不错,但我可能会选择第一种方法。根据经验,将代码放在一个存储库中不那么令人头痛。另一方面,拥有两个存储库可以实施更好的分离和依赖管理。
另一种方法是让您的三种产品仅依赖于公共代码的二进制文件。这为您提供了更多灵活性,并提供了更好的构建版本跟踪。在此方案中,您将定期提供公共代码的versiondo二进制版本。然后,您的三个产品可以是他们自己的存储库,也可以是同一个仓库中的三个分支。此外,仅依赖于二进制文件可确保不会产生任何不需要的来源。另一个好处是,您可以更快地构建三种产品,因为您不必与每种产品一起构建公共源。
答案 1 :(得分:1)
请允许我大胆并为此提出不同的方法。
不是为每个版本的独特功能物理分离代码,而是拥有一个二进制文件可能是有意义的,然后根据正在使用的版本,通过feature toggles启用特定功能。
这将使您能够发布特定版本,同时减少维护三个不同代码库的开销,并允许您在业务决定必要时轻松地将现有功能包含在版本中。
答案 2 :(得分:0)
我会创建三个repos,每个版本一个。
然后是一个带有公共部分的第四个回购,它将作为子模块包含在另外三个回购中。这背后的基本原理是您可能希望能够在三个版本(子模块的不同版本)中集成不同版本的公共部分。您还希望能够开发出公共部分,而不必将其强加于任何可释放的部分。
这应该与您的选项1一样灵活,但没有公共部分分支的疯狂合并。
答案 3 :(得分:0)
我不愿意为此使用Git,因为它看起来更像是一个依赖性问题而不是存储库问题。当然,有一些方法可以通过子模块来解决这个问题,但它们可能很难使用。
我将子模块保存为最后的努力,但让我们考虑一下有关程序依赖性的一些事情。
我们要弄清楚的主要事情是,这些项目中的每一个都有一组核心代码和功能,我们希望这些代码和功能可以让其他项目依赖。
一旦实际上已经解开了 - 就像我们现在了解每个项目的哪些部分可以在应用程序之间共享 - 我们会发布这些工件,然后指定每个应用程序依赖于其中一个。我可以想象它会如此:
这是一个依赖管理器的用武之地。它们现在存在于大多数现代语言中;例如,如果您使用的是Maven或Gradle,则可以将每个模块设置为自己的项目,并将核心模块发布到公司某处的内部存储库目录中。
Git子模块可能能够覆盖它,但我强烈建议使用其他路由并使用适当的依赖管理器。