- 当项目越来越大之后,用一个仓库维护进行版本维护。导致.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 参数
- git submodule add -b
1git submodule add https://github.com/clibing/dockerfile.git dockerfile/clibing.dockerfile
- 查看gitsubmodule内容
1[submodule "dockerfile/clibing.dockerfile"]
2 path = dockerfile/clibing.dockerfile
3 url = https://github.com/clibing/dockerfile.git
- 指定分支
1git submodule add -b v1.0 https://github.com/clibing/dockerfile.git dockerfile/clibing.dockerfile
- 查看.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 子模块目录
代码是从仓库的记录中删除,不在记录添加修改删除的每一步操作。否则会记录模块的增加和删除动作。
评论