• 当项目越来越大之后,用一个仓库维护进行版本维护。导致.git文件会越来越大,会造成 request body 过大等http协议上的错误。所以需要将一个大项目拆分各个子模块独立进行版本管理。同时还可以设置专人负责模块。
  • 当项目越来越成熟,关注较高时,项目设计成对外开放(例如可以自由切换模板、可以安装插件)。当作者发现某些第三方的模块受关注度较高时。可以引入第三方放的模块。例如OpenWRT,Jenkins、ES等

常用命令

1git clone <repository> --recursive 递归的方式克隆整个项目
2git submodule add <repository> <path> 添加子模块
3git submodule add -b <branch> <repository> <path> 添加指定分支的子模块
4git submodule init 初始化子模块
5git submodule update 更新子模块
6git submodule foreach git pull 拉取所有子模块

详细说明

git submodule添加、更新和删除

  • git submodule add
  • url: 替换为自己要引入的子模块仓库地址
  • path: 要存放的本地路径
  • 执行添加命令成功后,可以在当前路径中看到一个.gitsubmodule文件,里面的内容就是我们刚刚add的内容

如果在添加子模块的时候想要指定分支,可以利用 -b 参数

  1. git submodule add -b
1git submodule add https://github.com/clibing/dockerfile.git dockerfile/clibing.dockerfile
  1. 查看gitsubmodule内容
1[submodule "dockerfile/clibing.dockerfile"]
2	path = dockerfile/clibing.dockerfile
3	url = https://github.com/clibing/dockerfile.git
  1. 指定分支
1git submodule add -b v1.0 https://github.com/clibing/dockerfile.git dockerfile/clibing.dockerfile
  1. 查看.gitsubmodule内容
1[submodule "dockerfile/clibing.dockerfile"]
2	path = dockerfile/clibing.dockerfile
3	url = https://github.com/clibing/dockerfile.git
4	branch = v1.0

添加完模块进行模块代码的拉取

当我们add子模块之后,会发现文件夹下没有任何内容。这个时候我们需要再执行下面的指令添加源码。

1git submodule update --init --recursive
2或者
3git submodule init
4git submodule update

更新第三方代码

我们引入了别人的仓库之后,如果该仓库作者进行了更新,我们需要手动进行更新。即进入子模块后,执行git pull 进行更新。

1git pull
2# 或者
3git submodule foreach git pull
4
5# 将submodule 强制更新
6git submodule update -f --recursive --rebase --checkout

模块的删除

这块涉及的点比较多

  • 删除子模块目录及源码
1rm -rf 子模块目录
  • 删除 .gitmodules 中的对应子模块内容
1vi .gitmodules
  • 删除 .git/config 配置中的对应子模块内容
1vi .git/config
  • 删除 .git/modules/ 下对应子模块目录
1rm -rf .git/modules/子模块目录
  • 删除git索引中的对应子模块
1git rm --cached 子模块目录

代码是从仓库的记录中删除,不在记录添加修改删除的每一步操作。否则会记录模块的增加和删除动作。