git submodule解决多包协作

项目背景

当项目A开发到一定量级之后,往往需要将多个子模块进行拆分,我们希望各个子模块独立,减小相互间的影响。同时有需求需要在这个项目的基础上,另起一个项目B,将部分功能剔除,A和B交集的功能需要同步更新。拆分之后,我们会面临如下问题:

  • 如何处理子模块的依赖
  • 依赖更新后同步的问题

解决方案

monorepo

业界首推的是采用monorepo,将相关的模块用单一的仓库统一管理,前端技术方向大势所趋,该方案需要我们将工程的多个组件抽象成npm包,通过npm install的方式引入依赖。该方案优缺点:

  • 抽成组件之后,获取依赖简单,npm install就能处理。
  • 简洁,前端前沿方案。
  • 对于进行已久的老项目需要比较清晰的设计与抽离子模块,工作量大。

submodule

通过npm包的方式是前端项目的一个比较好的解决方案,但相对于成型效果比较好的monorepo,git自带的submodule更贴切人少工作量大的团队,是一种通用的解决方案。
submodule的方式需要我们先将要抽离的子模块放到不同的git仓库。在主项目的.gitmodules中写明引用的仓库,就能够同步关联子模块。

常用命令

git clone <repository仓库地址> --recursive //递归的方式克隆整个项目,子模块也会克隆
git submodule add <repository子模块仓库地址> <path想要放置在主项目路径> //添加子模块
git submodule update --recursive --remote //拉取所有子模块的更新

如何使用

克隆已有字模块项目

当我们直接克隆一个带有子模块仓库的项目时:

git clone git@xxxx.git --recursive //递归的方式克隆整个项目,子模块也会克隆

然后更新所有子模块:

git submodule update --recursive --remote //拉取所有子模块的更新

为现有项目添加子模块仓库

创建一个仓库放置 utils模块(比如utils文件夹,需要放在src目录下),在主项目中执行

git submodule add git@xxxx.git ./src/utils //添加子模块

就可以在项目中添加子模块,主项目中的.gitmodule文件会增加该模块的标识。(想要成功添加utils文件夹,必须原来目录下没有utils文件夹)

[submodule "/src/utils"]
      url = /Users/nick/dev/nick-doc/testGitSubmodule/utils.git
修改子模块

一般来说,不同的仓库的文件应该在不同的工作目录下修改,但是实际情况下,子模块A的效果必须在主项目的工作目录下调试,才能进行开发,这就导致了修改 子模块A的某个文件,会引起主项目和子模块git检查的变化。这种情况,只需在主项目.gitignore文件添加上子模块的目录即可,如/src/utils。完成修改子模块之后,在子模块的目录将该修改提交至远程。
然后在主项目拉取子模块的更新:

git submodule update --recursive --remote //拉取所有子模块的更新

这时主项目的git会检查到刚刚提交的子模块的提交记录发生更改,正常的在主项目下 commit和push即可。这样主项目就便将最新的子模块引用提交到最新。

删除子模块
 git submodule deinit /src/utils 
 git rm -f /src/utils 
 rm -rf .git/modules/src/utils 

删除子模块后.gitmodule文件里就会对/src/utils的索引删除了。

注:

  1. 使用gitmodule会遇到的问题

猜你喜欢

转载自blog.csdn.net/weixin_38131307/article/details/110151393