子模块相关

基本命令

为项目添加子模块

1
git submodule add "repository-address"

上述命令会在项目根目录下建立一个与子模块同名的文件夹。同时在项目根目录新建.gitmodules文件,内容如下。

1
2
3
[submodule "repository-name"]
path = repository-name
url = "repository-address"

若需指定子模块的存储未知,可在上述命令后添加存储路径

1
git submodule add "repository-address" deps/repository-name

初始化

1
git submodule init
1
git submodule update --init

子模块的更新

1
git submodule update --remote

上述两个命令会更新所有(平级的)子模块,但不会涉及子模块的子模块。

若想对子模块的子模块进行初始化或者更新,需要进入相应子模块,重复执行上述命令。

dirty 问题

在已有的本地项目中更新子模块,更新后会在Subproject commit xxxxxx后出现后缀-dirty,表示这个子模块做了与远程仓库不同的修改。目前没有深究和找到确切的原因。但怀疑是子模块的子模块初始化/版本错配导致的。使用git status查看项目整体状态如下。

1
2
3
4
5
6
7
8
9
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: deps/repository-name (new commits)

no changes added to commit (use "git add" and/or "git commit -a")

其中,子模块被标记了 modified,而且有新的 commit;同时我并没有对子模块的代码进行修改。所以基本能印证上述猜测。

在上一节提到,初始化/更新子模块的子模块需要手动操作,这样就很有可能导致子模块版本与子模块的子模块版本不一致的问题。进而被标记为 dirty。

暂时也没有什么好的解决办法,把子模块的子模块删了,或者把整改子模块都删了,重新逐级手动初始化/更新。