为什么 Git 在两个地方存储子模块 URL?

Why does Git store submodule URLs in two places?

当我们在工作中切换主机时更新 Git 子模块路径时,我惊讶地发现路径存储在 .gitmodules 和 .git/config 文件中。

这背后的thinking/reason是什么?

.gitmodules 文件随存储库一起提供,并指定在克隆存储库时使用的位置。但是,.git/config 用于存储您希望用于给定实例的值。

当您希望使用不同于配置中指定的 URL 时,此方法很有用。例如,您可能有子模块的内部镜像,或者您可能希望使用 SSH 而不是 HTTPS。这也意味着除了初始克隆期间不需要存储库的内容,因此您不必担心来自不受信任的分支的 git pullgit checkout 修改您的配置并在 [=10= 上合并冲突] 不影响子模块操作。

此外,Git 的安全模型不允许不受信任的配置文件:可以修改您的存储库配置的人可以执行任意代码。通过只复制特定的配置设置并且只复制一次,Git 可以避免必须使用特殊代码来只从工作树中读取经过清理的条目。

如果你想同步它们,你可以使用git submodule sync来完成。