Git子模块的两个常见问题

107 阅读1分钟

Git子模块很有用,但它们的用户体验对那些根本没有与子模块互动的用户来说有点干扰。这里列出了我经常遇到的两个常见的问题。(如果有其他朋友经常碰到的,请告诉我!)

我克隆了一个包含子模块的 repo,但里面什么都没有!这是什么情况?

如果你克隆一个子模块而没有--recursive 标志,就会发生这种情况。解决的办法是运行

git submodule update --init --recursive

这将初始化一切。

我想这不是默认的主要原因是,如果你实际上不需要子模块,克隆子模块会浪费大量的时间、磁盘空间和/或带宽。

为什么子模块显示在git status ,尽管我从来没有碰过它们?

这可能发生在git pull,git checkout, 或git reset 之后,它们改变了工作树,但没有更新子模块,导致它们滞后。在git status ,这个问题表现为:

modified:   mysubmodule (new commits)

如果你确定你没有改变子模块中的任何文件,你可以用以下方式更新它们

git submodule update --recursive

我不确定为什么这不是默认的。也许是为了避免意外地丢失子模块内的修改?