使用submodule可以在仓库A中引用仓库B的特定版本的代码,例如你的项目中使用了另外的开源项目,可以将它作为submodule来管理。


使用方法

1. 添加子模块

在一个项目中新增一个子模块,用下面的命令

git submodule add <repository-url> <path>

git将会完成以下工作:

  • 创建指定的子模块目录path
  • 在项目的根目录创建文件.gitmodules,在内部记录子模块的URL和路径。
  • 自动拉取子模块仓库的默认分支的最新commit。

2. 提交子模块修改

  • 在子模块的目录中,使用git pullgit checkout等正常修改commit id
  • 在父项目中,子模块的变更会被识别为一个发生在path_of_submodule的修改,正常提交即可。

3. 拉取/更新子模块

如果在已有的项目中,存在子模块的commit id和父项目记录的子模块commit id不一致的情况(包括子模块目录为空),那就需要额外拉取一下子模块的代码

git submodule update --init

这个命令实际上做了两件事情,

  • 如果.gitmodules的内容未被配置到父项目的.git/config文件,那么执行git submodule init进行配置。
  • 检查父项目的commit id,进入子模块目录中git checkout到对应的commit id

4. 克隆一个带子模块的项目

如果要克隆的项目带有子模块,那可以使用--recurse-submodules选项递归克隆所有子模块,一步到位。

git clone --recurse-submodules <repository-url>