# 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)