将属于同一总体项目的多个Git存储库分组


14

假设我有一个包含多个组件的项目:服务器组件,Web应用程序组件,iOS组件,Android组件等。这些组件都是单独的代码库,但也松散耦合(例如,对服务器的更改)代码也可能需要更改所有其他组件)

在Git中组织此项目的最有效方法是什么?如果将所有内容放在一个存储库中,则始终会拥有最新版本,但是当您开始更改一个组件而不是其他组件时,事情变得很混乱。

另一方面,如果将每个组件都作为一个单独的存储库,则如何“链接”这些存储库,以使您知道该应用程序的2.0版要求服务器组件的1.5版等?

除了保持最新的自述文件(或者我看不到的更好的解决方案)之外,git中是否还有功能可以更有效地管理多个相关的存储库?


这些组件实际上是否相互依赖,例如可释放组件和库之间的关系?还是只是试图使所有可释放组件保持同步?
没用

这是有关StackOverflow较早讨论(奇迹般地尚未结束)。
Dan Dascalescu 2015年

Answers:


6

子项目是分布式版本控制系统(DVCS)开始的地方,即使不瓦解,也肯定会变得有些古怪。

Git 子模块和Mercurial 存储库 都旨在为子项目提供支持。两者都改进了逐个发布的版本(以至于Mercurial的旧“该功能存在,但您可能不应该使用它”警告不再是居于中心。)

尽管如此,多项目存储库仍然更多地是特殊用例,而不是每个人都使用它的功能。该文档包含许多警告和“如何使用此”说明,这些说明清楚地表明,管理“项目项目”是一个两级问题,其元管理与直接的单级项目管理稍有不同,但真正不同。结果,那里的经验要少得多。而且不乏“不要使用git子模块!”的不足。和“避免使用汞!” 评论和博客文章。

我自己在subrepos方面的经验好坏参半。它奏效了...但也很烦人。我喜欢子项目的想法,但是在实践中发现替代方案-大型多合一存储库或同级兄弟项目-更容易争吵(尽管不太优雅)。我期待子仓库成为主流,而不是痛苦,但是我还没有经历过。

这并不是说管理子模块/子存储库对您不起作用,但这是应该谨慎进行的工作,并且肯定要事先进行一些试验和计划。

鉴于您专注于Git,还应该探索Git子树,有人发现它是git子模块的更好替代方案


1
在2016年重访:Hg文档称subrepos是不得已功能。Git文档更加热情,并且其子模块功能现在更加集成。两者现在都还可以很好地处理嵌套存储库(通过其管理的文件识别嵌套存储库“具有优势”),从而提供了另一个有用的子存储库选项。但是DVCS工具仍主要用于单级存储库,因此“ sub-repos =>多级管理”和“龙在这里”警告仍然很重要。
乔纳森·尤妮丝

2

如果使用C#,则可以使用NuGet。

使每个组件成为一个库,并将其保存在自己的存储库中。释放根据语义版本控制版本的基本组件。

最后,让您的构建服务器将库打包成NuGet包,并在项目中使用这些NuGet包作为前端组件(iOS,Android)。

同样的基本方法(版本和程序包依赖性)也可以在其他语言中使用,但可能不太方便。

我不建议您使用Git子模块。虽然理论上可以将其用于此类问题,但我认为这是一个比其价值更大的麻烦。


2

我认为,这将取决于它们实际耦合的程度。git bisect跟踪回归时能够自动运行非常好,但是如果每次提交都依赖于要运行的其他依赖项的不同版本,这将很难做到。

两种可能的选择是一个具有子模块的存储库,或者是具有良好版本控制实践的多个存储库。

您将如何“链接”这些存储库,以便使您知道该应用程序的2.0版需要服务器组件的1.5版等?

这通常是某些依赖项管理框架(例如Gradle,Maven)的领域,而不是Git本身。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.