2017-10-18 60 views
0

我想宣传我公司内部monorepo的想法。
我打算使用他们这样说:Git的子模块轨道分支用途不同

我有一个“父”回购拿着我们的堆栈的每个部件一个子模块,从而维护全球版本为整个堆栈(我们可以简单签上给出的分支的每个组件)

这听起来很完美的,因为我们仍然可以任意CI服务开箱(益处,我们仍然推自主混帐回购协议,该子模块)。

唯一的(可怕的)弱点这种做法,也就是如果做一个

git submodule update --remote 

采用以下配置:

[submodule "commonLib"] 
    path = commonLib 
    url = [email protected]:org/commonLib.git 
    branch = MY_BRANCH 

每个子模块有效地在正确检查,驱赶出局提交。

但是:他们都在分离的头

为什么有没有办法有效地使用gitsumodule设有分公司。 即:更新时,有效检出分支而不是此分支指向的提交? 是出于技术原因还是根本没有在git中实现?

感谢答案

+0

我们遇到了同样的问题。问题是,每次更新子模块时,主存储库都需要更新子模块,这将使主站更新主站分支。最后,我们将核心项目组合成单个回购,解决了问题。子模块最适合第三方依赖项以及其他不经常更改的私有项目。理想情况下,每个子模块应该独立构建,因此它可以独立运行在CI上。 你可能会看看谷歌git回购,部分解决这个问题。 https://gerrit.googlesource.com/git-repo/ –

+0

你能否详细说明你正在谈论的问题,我不确定以正确的方式理解它。 – Clement

+0

据我所知,如果你使用分支追踪,checkouted子模块将直接指向正确的提交,但不指向指向该提交的分支。这意味着每个人在工作之前都必须注意检查正确的分支......而这又让我感到困扰。 – Clement

回答

1

一部分是git的子模块被设计为允许一组多个资源库中的一致/一致的看法。而要实现这一目标的唯一途径是让每个子模块锁定在一个特定的版本,与母公司回购跟踪所有版本的所有子模块,从而使整个项目monorepo的外观。

当在这样的项目环境中工作时,仅仅在分支级别指定某个子模块没有多大意义,因为它可能会选择与项目其余部分不一致的版本。

答案的另一部分是不特定的git的子模块,但任何混帐回购:拉一个特定的版本时,回购将在分离的头的状态。随着因的Git分支不是很多的分支识别支持不具有相同的意义和重要性,在其他版本控制系统,详见这个优秀的答案:https://stackoverflow.com/a/3162929/4495081

我看到更新的选择分支,在右侧时,减少人为错误的风险的2点可能的方式:在您的所有信息库和标签/标签

  • 使用一致的分支名称(最好是由你的CI制作/ CD系统),其分支名称以其标识符编码。在开始时相当困难卖出,与每一个组件的球队拥有完全的决策权的欲望,但它可以变得更好,如果/当球队最终了解到他们实际需要对齐,使一个连贯的产品在一起。

  • 提供项目级自动化包装来操作仓库,这会从父仓库提取适当的分支信息(同时执行健全性检查和/或相关操作以维护开发人员的工作空间和项目一致性)。