记录一些使用 Git Submodule (子模块)时经常遇到的疑惑与成因

392 阅读1分钟

为何要使用子模块?

当你有多个系统需要使用一些相似的逻辑时,你肯定不希望每次都各种 CV,因此我们需要一个引入一个单独的工程,供其他工程使用。

为什么有时在父工程上提示子模块有更新,但我使用 git submodule update 之后子模块进入了一个游离的节点?

首先,父工程对子模块的引用是以 commitId 为节点的,和分支无关。当你 update 之后,子模块的确进行了更新,但是一旦更新以后,所在的位置就不是父工程所需要的那个节点了,因此子模块在每次 update 之后会自动检出到父工程上次引用子模块的那个 commit 节点。而这个 commit 节点就会是那个游离的节点的哈希值。

为什么有时候我 git submodule update 会失败,并且提示我本地的子模块内没有所需要的commit 节点?

这是大家刚开始用子模块时经常犯的错误,即在父工程中更新了子模块的 commitId,但子模块并没有提交这个节点。因为我们怎么拉也拉不下来代码。此时需要做的是去子模块那儿提交并推送一下,让远程仓库更新。