用 git subtree 来实现 Monorepo 是个好主意吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
twistedmeadows
V2EX    问与答

用 git subtree 来实现 Monorepo 是个好主意吗?

  •  
  •   twistedmeadows 2023-06-28 17:56:32 +08:00 1197 次点击
    这是一个创建于 837 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们的系统是一个假的微服务架构,虽然有很多微服务组件,但实际需要把所有微服务都打包到一起来安装和部署。

    个中缘由就不展开了。现在领导提出新的要求,要把单体仓库拆分成每个组件独立的仓库,来实现对代码权限的细分。

    但这种 multi repo 的形式对 CI 构建打包造成了很大的挑战:由于我们的微服务架构是假微服务,实际上某些组件之间是有强依赖的,当某个新特性开发时,相关组件都需要一起刷版本,才能实现正确的功能,否则会因为接口对不上之类的情况而不能正常工作。

    由于 gitlab 的 CI 对于跨库的 pipeline 支持较弱,只能通过 trigger 下游的方式来创建关联性;这在 multi repo 数量越来越多的情况下是灾难性的。

    所以我们想为 CI 创建一个 MonoRepo ,由权限较高的用户来控制,它可以以 submodule 的方式把所有子仓库都收集到一起,然后在这个仓库中定义 CI Pipeline 就比较清晰。

    各微服务组件有自己独立的仓库,可以在上面自由开发,每周或每个特性再提一笔 MR 到 MonoRepo 来,使主仓库集成该改动。基于 MR 可以触发整个系统的打包,供测试取用。

    • 进入正题

    submodule 方式也有它的弊端子仓库的一项变动,提交到主仓库时,仅仅表现为一个 commit id 的变化。这中间如果有操作失误,或者别的错误合入,主仓库的管理者是不容易察觉的。

    所以我们想用 git subtree 的方式来建立这个主仓库,在这个形式下,每个子库的代码会直接以实体文件存在于主仓库中,改动提过来也会是代码形式的改动。

    已知的缺点就是,主仓库只有高权限用户可见,所以变更提交也得由高权限用户发起,相当于领导自己提 MR 自己审。(但这个缺点在 submodule 方案中也存在,我们可以为它调整研发流程,例如用 bot 自动创建)

    • 想问下有没有实践过这种方案( git subtree 实现 Monorepo )的团队?用起来怎么样?

    如果有多项任务并行在开发,容易发生冲突吗? (因为我们察觉到 subtree 合并时发生的冲突解决起来比较麻烦,如果在主仓库解决了,主仓库代码就跟子仓库脱节了,所以得回子仓库去解决)

    1 条回复    2023-06-29 10:09:11 +08:00
    HuskyYellow
        1
    HuskyYellow  
       2023-06-29 10:09:11 +08:00
    我也想过这个事,但是有个问题,每次拉代码都要去拉一遍子仓库的代码,还有个问题是如果子项目过多,其实维护起来还是没有一个项目方便的。除非子仓库更新频率不高。 以上仅个人建议。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     831 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 21:22 PVG 05:22 LAX 14:22 JFK 17:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86