新建

在项目根路径下,将另外一个git项目初始化为当前项目的子模块

命令格式:git submodule add <子模块仓库URL> <子模块存放路径>

git submodule add <git@e.coding.net:*****.git> sub

另外一个项目会克隆在当前路径下的子模块存放路径sub

同时会生成一个.gitmodules文件保存子模块信息

[submodule "sub"]
	path = sub
	url = git@e.coding.net:*****.git

查看项目中所有子模块

git submodule status
-7ab1de2d21d3c4e56f7890123456789012345678 sub1 (heads/main)
-1234567890123456789012345678901234567890 sub2 (heads/master)

克隆

默认情况下,clone一个带有子模块的项目时,只会把子模块所在的文件夹克隆下来,结果是一个空文件夹

- project/
  - src/ # 完整目录结构
  - sub/ # 空目录
  - build.gradle.kts
  - gradlew
  - gradlew.bat
  - README.md

这时,需要初始化子模块

git submodule init

此命令依据当前项目的.gitmodules文件记录的子模块信息初始化所有子模块

如果需要只初始化指定子模块,需要添加参数

git submodule init -- sub1 sub2 sub3 ... subn

update命令更新所有子模块。若需要更新指定子模块,格式同init命令

# 初始化所有子模块
git submodule update

# 初始化指定子模块
git submodule update -- sub1 sub2 sub3 ... subn

移除

  • 移除子模块文件

git submodule deinit -f sub1
  • 移除子模块git目录

rm -rf .git/modules/sub1
  • 更新项目git索引

git rm --cached sub1
  • 提交变更

git commit -m "Remove submodule: sub1"