
概述
有这么一个场景:

有3个项目, 商城系统 、 后台系统 、 论坛系统 , 这3个系统都需要依赖一个工具类库,比如说处理日期的。
在传统的开发模式中,这几个系统都会重复实现一遍日期工具类,当日期工具类出现了一个bug,每个系统都得Ctrl+C / Ctrl+V,这样一来就会带来工作效率的问题。
解决上述问题很简单,可以通过 npm 模块解决, 但是 npm 带来的问题就是每次改动都需要发布,而且某些数据有保密性的发布到外网就不合适了,内网搭建的话就有点大材小用了。
这个时候 git submodule 用处就来了。
给主仓库添加子模块
add 跟着需要添加为子模块的仓库地址
git submodule add https://github.com/xjh22222228/tomato-work.git
成功添加后会在项目根目录下新建 .gitmodules 文件

删除子模块
当子模块不再需要的时候可以使用下面命令:
# common 为模块的目录名字
# 1. 逆初始化模块, 执行后子模块目录将被删除
git submodule deinit common
# 2. 清除子模块缓存
git rm --cached common
# 3. 提交代码并推送
git commit -am "Remove a submodule" && git push
更新子模块代码
有2种方法可以更新子模块的代码。
1、进入子模块目录拉取Code
cd common
git pull
2、在主项目拉取,common 为子模块的名称
git submodule update --remote common
第二种方式默认针对 master 分支, 如果需要更新其他分支就要配置, develop 为分支名称:
git config -f .gitmodules submodule.common.branch develop
克隆包含子模块仓库
--recursive 使用递归模式,否则子模块代码是无法克隆的
git clone --recursive https://github.com/xjh22222228/tomato-work.git
修复子项目为detached head
当克隆项目后所有子模块的分支都指向 detached head, 为了修复这个问题,直接在根项目执行:
git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
最后
子模块作用于公共代码,如果想在项目中包含某个库的代码那么这个时候就需要 git submodule 了。