我现在面临着在Git中组织两个项目代码的挑战。有两个软件A和B,一个可以说B与A相同,只是它具有一些附加模块(更多功能)。所以现在的问题是,我有两个项目,但是我不能简单地将它们分成两个存储库,因为它们共享相同文件的4/5。 A和B被编译为两个独立的软件版本,那么如何组织它们才有意义?
我曾经考虑过要有2个存储库,但是如何使它工作,以便在更改A中的某些内容时也更新B?这在Git中是如何工作的(对不起,我还没有使用更高级的Git)?而且,是否可以在不同时编译A的情况下编译B(发布)?任何帮助将不胜感激,如果我没有正确描述某些内容,请告诉我。提前非常感谢您。
答案 0 :(得分:1)
简短答案:
摩擦,试验和最终的脑损伤
详细答案:
这取决于。根据您的语言,框架等,您应该旨在将“其他模块(更多功能)”隔离到单独的软件包中,并在自己的存储库中进行管理。这样,您只需更改配置(npm package.json,python Pipfile,ruby gemfile等)即可添加其他功能并使用环境变量启用它们。每个“项目”都有其自己的配置文件,该文件将启用功能的子集或超集。
通常来说,这很耗时(每个发布周期都会消耗更多的资源,以确保两个项目都能正常运行)。找出一种方法,使一个存储库仅包含两个项目的重用代码,并通过一个或多个单独维护的包隔离其他模块。
它仍然取决于特定的要求,软件语言,工具等。
答案 1 :(得分:0)
您有一些选择,应该将它们组合使用。
配置可能意味着使用配置标志打开和关闭功能。这也可能意味着为A和B使用单独的模板。A和B成为已保存的配置。这可能是最适合外观变化的功能,或者是诸如数据库和API凭据之类的功能在流程中必不可少的更改的最佳选择。
将其他位提取到模块中将很有意义。允许连接到新数据库或API的子类。
最初,您可以将所有内容作为单个存储库进行管理。 A和B就像存储库中单独的目录一样简单。可能看起来像这样。
base/
modules/
feature1/
feature2/
releases/
A/
config
templates/
B/
config
templates/
一切都在一个仓库中既简单又方便。最初它会为您服务,可能只是您所需要的。但它鼓励将所有内容紧密结合在一起。当您只需一次更改所有内容时,为什么还要编写经过深思熟虑的API?
如果发现需要更多的模块化,则可以将基础,每个模块和每个发行版提取到各自的存储库中。这会带来依赖性管理。
最初,A和B可以将其从属库和模块存储库提取为Git Submodules。这将在短期内起作用,但是这是管理依赖项的一种糟糕方法,并且再次鼓励将事物紧密地绑定在一起。
最后,您将每个存储库作为自己的项目分别进行管理。使用您语言的普通系统分发模块(Ruby gem,Javascript npm,Python包等),就像使用任何项目进行发行一样,可能使用私有模块存储库。然后,A和B会使用您语言的依存关系系统进行安装,以选择要安装的其他功能。
这需要一些实践才能正确,对于许多内部项目而言,完整版本和依赖管理是过大的。首先将所有内容重新组织到一个存储库中的子目录中,这可能会很困难,并查看是否需要更多。