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会遇到的问题
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Git submoduleGit 的一个功能,可以将一个 Git 仓库作为另一个 Git 仓库的子目录进行管理。通过使用子模块,我们可以在一个 Git 仓库中使用另一个 Git 仓库的组件。 使用 git submodule 的步骤如下: 1. 在父项目中添加子模块:使用命令 `git submodule add <子模块仓库地址> <子模块存放路径>` 将子模块添加到父项目中。 2. 克隆子模块:使用命令 `git submodule init` 初始化子模块,然后使用命令 `git submodule update` 克隆子模块的内容。 3. 切换到子模块分支:通过 `cd <子模块路径>` 进入子模块目录,然后使用 `git checkout <分支名>` 切换到子模块所在的特定分支。 4. 更新子模块:在父项目中使用命令 `git submodule update --remote` 可以更新子模块为最新的提交。 5. 提交子模块修改:在父项目中修改了子模块后,需要切换到子模块目录,进行提交和推送操作。 使用子模块的好处是可以将子项目作为独立的仓库进行开发和维护,同时在父项目中方便地使用和更新子模块。使用子模块可以实现项目的模块化和复用,提高代码的可维护性和可重用性。 需要注意的是,使用子模块时需要注意子模块的分支和版本控制,因为子模块可能会更新,需要及时更新父项目中的子模块。同时,在多人协作开发中,也需要注意在提交父项目时确保子模块的修改也已经提交。 总之,使用 Git submodule 可以方便地在父项目中使用子模块的组件,提高代码管理的灵活性和可重用性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值