submodule 子模块
最后更新于:2022-04-02 02:53:31
[TOC]
## 概述
- submodule 是一个很好的多项目使用共同类库的工具
- 它允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commit,push,pull
- 父项目以Submodule的形式包含子项目
- 子模块可以有多个
- 某个子模块表现为一个目录, 如 [actionview](https://github.com/lxerxa/actionview)
## 语法
```
git submodule [--quiet] add [] [--] []
git submodule [--quiet] status [--cached] [--recursive] [--] […]
git submodule [--quiet] init [--] […]
git submodule [--quiet] deinit [-f|--force] (--all|[--] …)
git submodule [--quiet] update [] [--] […]
git submodule [--quiet] summary [] [--] […]
git submodule [--quiet] foreach [--recursive]
git submodule [--quiet] sync [--recursive] [--] […]
git submodule [--quiet] absorbgitdirs [--] […]
```
## 场景
### 创建子模块
```
git submodule add git@github.com:zjZSTU/hexo-theme-next.git blogs/themes/next
```
除了添加子仓库之外,还生成了一个配置文件`.gitmodules`
```
> cat .gitmodules
[submodule "blogs/themes/next"]
path = blogs/themes/next
url = git@github.com:zjZSTU/hexo-theme-next.git
```
### 管理子模块
主仓库只能提示子模块中的文件修改,必须子模块自己进行添加和上传
### 子模块的更新
```
// 进入子模块
git pull
// 完成后返回到项目目录,可以看到子模块有待提交的更新
git add
```
### clone 带子模块的项目
```
# 初始化本地配置文件
$ git submodule init
# 拉取远程仓库
$ git submodule update
```
### 修改某子模块URL
1. 修改`.gitmodules`文件中对应模块的”url“属性;
2. 使用`git submodule sync`命令,将新的URL更新到文件`.git/config`;
### 删除Submodule
git 并不支持直接删除Submodule需要手动删除对应的文件:
```
// 逆初始化模块,执行后可发现模块目录被清空
> git submodule deinit DbConnector
// 删除.gitmodules中记录的模块信息
> git rm --cached DbConnector
// 提交更改到代码库,可观察到'.gitmodules'内容发生变更
> git commit -am "Remove a submodule."
```
### 主模块提交时,忽略子模块
```
> cat .gitmodule
[submodule "blogs/themes/next"]
path = blogs/themes/next
url = https://github.com/zjZSTU/hexo-theme-next.git
ignore = all
```
设置 ignore 设置为 all
';