查看当前子模块

1
git submodule

输出类似:

1
 a1b2c3d4 libs/foo (heads/main)

这里的 libs/foo 就是子模块路径。

也可以查看:

1
cat .gitmodules

输出类似:

1
2
3
[submodule "libs/foo"]
	path = libs/foo
	url = git@example.com:foo/bar.git

方法一:将 Submodule 转为普通目录(保留源码)

这种情况不直接删除目录,而是把子模块目录转换成普通目录。

Linux / macOS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 子模块目录
SUBMODULE=libs/foo

## 注销子模块
## 会移除 .git/config 中的 submodule 配置
git submodule deinit -f "$SUBMODULE"

## 仅从 Git 索引中移除
## 不删除本地代码
git rm --cached "$SUBMODULE"

## 删除 Git 对子模块的本地缓存
rm -rf ".git/modules/$SUBMODULE"

## 删除子模块目录内部的 Git 指向
## 这里的 .git 可能是文件,也可能是目录
rm -rf "$SUBMODULE/.git"

## 重新作为普通目录加入 Git
git add "$SUBMODULE"

## 提交变更
git commit -m "convert submodule to normal directory"

Windows PowerShell

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 子模块目录
$SUBMODULE = "libs/foo"

## 注销子模块
## 删除 .git/config 中的 submodule 信息
git submodule deinit -f $SUBMODULE

## 仅从 Git 索引中移除
## 不删除本地代码
git rm --cached $SUBMODULE

## 删除 Git 对子模块的本地缓存
Remove-Item -Recurse -Force ".git/modules/$SUBMODULE"

## 删除子模块目录内部的 Git 指向
## 这里的 .git 可能是文件,也可能是目录
Remove-Item -Recurse -Force "$SUBMODULE/.git"

## 重新添加为普通目录
git add $SUBMODULE

## 提交变更
git commit -m "convert submodule to normal directory"

方法二:删除 Submodule(不保留源码)

Linux / macOS

下面命令仅需修改 SUBMODULE 字段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
## 子模块目录
SUBMODULE=libs/foo

## 注销子模块
## 会移除 .git/config 中的 submodule 配置
git submodule deinit -f "$SUBMODULE"

## 从 Git 索引和工作区中删除子模块
## 同时会更新 .gitmodules
git rm -f "$SUBMODULE"

## 删除 Git 对子模块的本地缓存
## 不删除这里,后续可能无法重新添加同名子模块
rm -rf ".git/modules/$SUBMODULE"

## 提交变更
git commit -m "remove submodule"

Windows PowerShell

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
## 子模块目录
$SUBMODULE = "libs/foo"

## 注销子模块
## 删除 .git/config 中的 submodule 信息
git submodule deinit -f $SUBMODULE

## 从 Git 索引和工作区中删除子模块
## 同时会更新 .gitmodules
git rm -f $SUBMODULE

## 删除 Git 对子模块的本地缓存
Remove-Item -Recurse -Force ".git/modules/$SUBMODULE"

## 提交变更
git commit -m "remove submodule"

检查

1
git submodule

如果没有任何输出,说明当前仓库已经没有初始化的子模块。

也可以继续检查:

1
cat .gitmodules

如果文件不存在,或者里面已经没有对应的 submodule 配置,说明 .gitmodules 也已经清理完成。

最后查看 Git 状态:

1
git status

确认变更符合预期后再提交或推送。