概述
有这么一个场景:
有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
了。