
# 设置子模块
#### 配置代码仓库的子模块概述
子模块（submodule）是Git为管理仓库共用而衍生出的一个工具，用户可以通过子模块将公共仓库作为子目录包含到用户的仓库中，并能够双向同步该公共仓库的代码，借助子模块用户能将公共仓库隔离、复用，能随时拉取最新代码以及对它提交修复，能大大提高用户的团队效率。
当仓库"Test_Fir"需要包含并使用仓库"Test_Sec"（第三方库，或者用户独立开发的，用于多个父项目的库），如果想要把它们当做两个独立的项目，同时又想在"Test_Fir"中使用"Test_Sec"，可以使用Git的子模块功能。 子模块允许用户将一个Git仓库作为另一个Git仓库的子目录。 它能让用户将另一个仓库克隆到自己的仓库中，同时还保持提交的独立。
子模块将被记录在一个名叫".gitmodules"的文件中，其中会记录子模块的信息：
```
[submodule "module_name"]      #子模块名称
path = file_path               #子模块在本仓库（父仓）中文件的存储路径。
url = repo_url                 #子模块（子仓库）的远程仓地址
```
其中，位于"file_path"目录下的源代码，将会来自"repo_url"。
#### 约束限制
如果"Test_Fir"仓库的内容将作为"Test_Sec"仓库的子模块，操作的用户需要有"Test_Sec"仓库的"设置"权限和代码的"提交"权限，请参考[配置代码仓库级的权限](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0066.html)提前进行配置。
#### 在Repo页面添加子模块
用户可以根据需要，选择以下任意方式添加子模块。
- 用户进入要添加子模块的仓库首页，单击"代码"，单击扩展按钮![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156196.png)，选择"新建子模块"，参考[表格]填写参数。
  ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002477145208.png)
  
- 用户进入需要添加子模块的仓库首页，单击"代码"，单击![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216316000.png)，选择"新建子模块"，参考[表格]填写参数。
  
  ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002509065997.png "点击放大")
  
- 用户进入需要添加子模块的仓库首页，上方导航栏选择"设置 \> 仓库管理 \> 子模块设置" ，单击"新建子模块"，参考[表格]填写参数。
  参数填写完成后单击"确定"按钮，即可完成新建子仓库操作。子模块新建完成后，可以在仓库文件列表的对应目录内找到子模块（子仓库）内容，其对应的文件左侧图标为![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275857.png)。
   表1新建子模块的字段说明 
  | **字段**  | **填写说明**                                  |
  |:---|:---|
  | 子模块仓库路径 | 用户需要选择一个仓库作为子仓库，这个仓库可以来自不同的项目。            |
  | 子模块仓库分支 | 用户需要选择同步子仓库的目标分支到父仓库。                     |
  | 子模块文件路径 | 用户需要配置子模块文件在本仓库下的路径，注意用"/"分隔层级。           |
  | 提交信息    | 作为用户新建子仓库的备注信息，可以在文件历史中查找到本次操作，限制2000个字符。 |
     
  
 
#### 在Git客户端添加子模块
1. 执行以下命令，添加Submodule。 
   ```
   git submodule add <repo> [<dir>] [-b <branch>] [<path>]
   ```
   - \<repo\>表示要添加的子模块的远程仓库地址。
   
   - \[\<dir\>\]，可选参数，指定子模块被克隆后存放的目录名。如果省略该参数，Git将根据仓库URL自动推断出一个名称。
   
   - \[-b \<branch\>\]，可选参数，表示指定要从哪个分支检出代码。如果不指定，默认会从默认分支检出。
   
   - \[\<path\>\]，可选参数，指定在父项目的.gitmodules文件中记录的路径。如果省略该参数，则默认使用\<dir\>的值。
   
   
   例如，执行下述命令，把WEB-INF.git仓库作为一个独立的子项目，嵌入到当前的Git项目。
   ```
   git submodule add git@example.com:****/WEB-INF.git
   ```
   
   
2. 执行以下命令，拉取包含submodule的仓库，即克隆一个包含子模块的Git仓库，并且自动初始化和拉取子模块的内容。 
   ```
   git clone <repo> [<dir>] --recursive
   ```
   - git clone \<repo\>表示克隆指定的Git仓库到本地，\<repo\>表示要克隆的远程仓库的URL。
   
   - \[\<dir\>\]，可选参数，指定克隆后的仓库保存到哪个本地目录。如果省略该参数，则默认使用仓库名称作为目录名。
   
   - --recursive，表示Git在克隆完成后，自动初始化并更新所有子模块中的内容。
   
   
   例如，执行下述命令，从远程仓库克隆一个名为WEB-INF的Git仓库到本地，并且如果WEB-INF仓库有子模块，还会递归地克隆所有子模块。
   ```
   git clone git@example.com:****/WEB-INF.git --recursive
   ```
   
   
3. 执行以下命令，从子模块的远程仓库（即origin或用户配置的远程）拉取最新的提交、更新子模块的代码到最新提交（通常是远程默认分支的最新提交，比如main或master），此更新不会自动合并或修改父仓库的代码，只是更新子模块的引用。 
   ```
   git submodule update --remote
   ```
   
   
4. 执行以下命令，推送更新到子库。 
   ```
   git push --recurse-submodules=check
   ```
   
   
5. 依次执行以下命令，删除Submodule。 
   1. 删除".gitsubmodule"中对应submodule的条目。
   
   2. 删除".git/config"中对应submodule的条目。
   
   3. 执行命令，删除子模块对应的文件夹。
      ```
      git rm --cached {submodule_path}
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/caution_3.0-zh-cn.png)
      填写路径时，请删除末尾的"/"。
      示例：如果用户的submodule保存在"src/main/webapp/WEB-INF/"目录，则执行命令为：
      ```
      git rm --cached src/main/webapp/WEB-INF
      ```
      
   
   
   
   
 
#### 编辑子模块
**用户具有代码仓的"设置"权限，即可编辑子模块** ，请参考[配置代码仓库级的权限](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0066.html)。
"子模块仓库路径"表示子仓库Git地址，单击"子模块仓库提交"，可查看子仓库的历史提交。
单击"部署密钥同步"所在列的![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216316008.png)，可以把父仓库的部署密钥同步到子仓库，同步后，子仓库将继承父仓库的部署密钥。
子模块校验结果列为存在，表示子仓库正常存在并可用。如果用户要删除此子模块，请单击"操作"列所在的![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275861.png)。
图1子模块设置页面   
![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216316012.png "点击放大")
