如何理解 Git submodule


Git 虽然很强大,但也有少数命令很难理解。 submodule 就是这么一个例子,其文档教程也不少,比如 Git - Submodules - git-scm.com , 但我之前始终没有真正领悟到如何使用。

直到有天看了一条 StackOverflow Answer ,茅塞顿开,才真正理解了 submodule ,下面尝试用自己的语言来解释一下。

submodule 涉及到两个仓库类型:

submodule

子模块,比如需要使用的第三方库

superproject

主仓库,自己的工程,依赖子模块代码

Git submodule 本质上是两个独立的仓库,各自可以独立地像普通的 repo 一样操作。 同时 superproject 有一个“指针”,记录了它使用的子模块的 commit revision 。 这个“指针”对于从 SVN 转过来的同学来说会比较不适应,因为 SVN External 没有这个设计, 所以 SVN 无法精确控制所使用的子模块 revision ,更新主仓库时会自动更新其“子模块”的代码为最新的, 如果“子模块”是外部的代码并且不稳定的话,会影响自己的代码。

在 superproject 中更新 submodule “指针”的操作如下:

/img/2019-01-13-git-submodule-diagram.png
submodule 更新示意图

无论是 superproject 还是 submodule ,都像普通的 repo 一样进行 branch, add, push, diff 等等的操作, 只是最后再通过 git submodule 命令再更新下新“指针”位置即可。

Git 

comments powered by Disqus