如何在Git中为具有共享模块的两个项目组织项目?

如何在Git中为具有共享模块的两个项目组织项目?,git,version-control,Git,Version Control,我现在面临着用Git组织两个项目代码的挑战。有两个软件A和B,可以说B与A相同,只是它有一些附加模块(更多功能)。现在的问题是,我有两个项目,但我不能简单地将它们分成两个存储库,因为它们共享相同文件的4/5。A和B被编译成两个独立的软件版本,所以我如何组织它们,使其有意义 我曾考虑过拥有两个存储库,但如何才能使其正常工作,以便在更改A中的某些内容时,B也会更新?这在Git中是如何工作的(很抱歉,我还没有在更高级的级别上使用Git)?我是否可以在不同时编译a的情况下编译B(发布版本)?任何帮助都将

我现在面临着用Git组织两个项目代码的挑战。有两个软件A和B,可以说B与A相同,只是它有一些附加模块(更多功能)。现在的问题是,我有两个项目,但我不能简单地将它们分成两个存储库,因为它们共享相同文件的4/5。A和B被编译成两个独立的软件版本,所以我如何组织它们,使其有意义


我曾考虑过拥有两个存储库,但如何才能使其正常工作,以便在更改A中的某些内容时,B也会更新?这在Git中是如何工作的(很抱歉,我还没有在更高级的级别上使用Git)?我是否可以在不同时编译a的情况下编译B(发布版本)?任何帮助都将不胜感激,如果我没有正确描述,请让我知道。提前非常感谢。

简短回答:

苦难、考验和最终的脑损伤

长答案:

视情况而定。根据您的语言、框架等,您应该将“附加模块(更多功能)”隔离到单独的软件包中,并在它们自己的存储库中管理它们。这样,您只需更改配置(npm package.json、python Pipfile、ruby gemfile等)即可添加附加功能,并使用环境变量启用它们。每个“项目”都有自己的配置文件,可以启用功能的子集或超集

一般来说,这很耗时(为了确保两个项目都能正常运行,每个发布周期都会消耗更多的资源)。找出一种方法,使一个存储库只包含两个项目的重用代码,并将其他模块与一个或多个单独维护的包隔离开来


它仍然取决于特定的需求、软件语言、工具等。

您有几个选项,它们应该结合使用

  • 将A和B之间的差异转化为配置选项
  • 提取A和B之间的公共位
  • 将额外功能提取为模块
配置意味着使用配置标志打开和关闭功能。这也意味着A和B有单独的模板。A和B成为保存的配置。这可能最适合于主要是表面性的更改,或者如果这些特性与数据库和API凭证等流程相当完整的话

其他位可以提取到模块中。例如,允许连接到新数据库或API的子类

最初,您可以将所有这些作为单个存储库进行管理。A和B可以像存储库中单独的目录一样简单。它可能看起来像这样

base/
modules/
    feature1/
    feature2/
releases/
    A/
        config
        templates/
    B/
        config
        templates/
一次回购的一切都简单方便。一开始它会为你服务,也许这就是你所需要的一切。但它鼓励将一切紧密地结合在一起。为什么要编写一个经过深思熟虑的API,而你却可以一次改变一切

如果您发现需要更多的模块化,您应该将基础、每个模块和每个版本提取到它们自己的存储库中。这就带来了依赖关系管理

最初,A和B可以将其依赖的基础库和模块库作为一个组件拉入。这在短期内是可行的,但这是一种管理依赖关系的糟糕方法,并且再次鼓励将事物紧密地绑定在一起

最后,您可以将每个存储库作为各自的项目单独管理。使用您的语言的普通系统分发模块(Ruby gems、Javascript npm、Python软件包等),可能使用私有模块存储库,发布任何项目所需的版本。然后,A和B将成为使用您的语言的依赖系统来选择要安装哪些额外功能的安装


这需要一些实践才能正确进行,对于许多内部项目来说,完整版本和依赖关系管理是过分的。首先将所有内容重新组织到一个存储库中的子目录中,这可能是一个足够的挑战,看看您是否需要更多。

让我们知道您使用的是什么IDE可能会有所帮助。对于VS,您可能会发现这一点很有用:欢迎使用SO。了解您使用的堆栈(以及A和B如何相互关联)可能会有所帮助。这实际上与项目管理无关。请看。非常感谢您的细致解释,我将从一个存储库开始,看看它是如何发展的。非常感谢您的回答,韦德。我将看看隔离其他模块是否可行。由于A和B是两个软件,我想分别编译它们,但我不知道如何在没有Git的情况下使用我自己的组织进行编译。。。你的回答让我知道从哪里开始,所以干杯!