# git子模块
---
### 一、什么是git子模块
我们先来说一个场景,当你遇到类似的场景时,可能你就需要使用git子模块了,并且你也会很容易的理解git子模块是什么。
当你需要在git仓库中引入另个一git仓库时这时你就需要使用git子模块了。很简单,话不多说,我们直接操作。
### 二、给现有的git仓库中新增子模块(另一个git仓库)
1. 在已有的仓库中执行以下内容添加子模块
```JavaScript
$ git submodule add git@git.kancloud.cn:webxiaoma/git.git
```
2. 查看子模块信息
```JavaScript
$ git diff --cached --submodule
```
### 三、克隆包含子模块的仓库
1. 方法一
```JavaScript
1.克隆项目,子模块目录默认被克隆,但是是空的
$ git clone git@github.com:webxiaoma/test.git
2.初始化子模块:初始化本地配置文件
$ git submodule init
3.该项目中抓取所有数据并检出父项目中列出的合适的提交
$ git submodule update
```
2. 方法二直接在父仓库中执行以下命令
```JavaScript
$ git clone --recursive git@github.com:webxiaoma/test.git
```
### 四、更新子模块
1. 方法一 更新子模块需要在子模块目录中进行操作
```JavaScript
$ cd 子目录
$ git fetch
$ git merge origin/master
```
2. 方法二 不需要再子模块目录进行
```JavaScript
$ git submodule update --remote 子模块名
// 上边默认更新master分支,如果更新其他分支
//这里是更新子模块Testgit 下的dev分支
$ git config -f .gitmodules submodule.Testgit.dev stable
$ git submodule update --remote
$ git merge origin/master
```
### 五、主仓库和子模块的推送
1. 在主仓库推送之前,要现在子模块中将代码进行推送,否则的话会推送失败
### 六、使用中的常见问题
1. 删除子模块后,再次克隆时报错,提示该模块已经存在
这种情况是删除子模块不彻底造成的。我们删除子模块时需要删除这些东西
> (1)删除子模块
> (2)删除父项目中的 .gitmodules 文件,当然这里前提是你只有一个子模块,如果有多个子模块需要在.gitmodules 文件中删除对应的子模块
> (3)删除.git 文件夹中的modules 文件 (.git 是隐藏文件夹,这里也是针对有一个子模块时)
> (4)删除.git 文件夹中的config配置 文件中的类似下面代码中指定的子模块
```JavaScript
[submodule "docs/javascript"]
url = git@git.kancloud.cn:webxiaoma/javascript.git
active = true
```
---
### 参考文献
1. [git 子模块](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97)