(为什么)git super-repository 除了指向子模块的指针之外还保留其他内容?

(Why) does git super-repository keep anything more than a pointer to submodules?

使用 git 子模块时,为什么会添加一个 project/.git/modules/<submodule name>/ 文件夹,其中包含似乎是(子模块的副本?)存储库的内容?

更新

好的,这就是我的感觉(在我的情况下,一切都是本地的,我表示它不必在的地方)

absolute/path/to/actual/<submodule>/.git ~= (本地)远程仓库
project/.git/modules/<submodule>/ ~= 本地克隆仓库
project/path/to/<submodule>/ = 本地签出 本地克隆存储库

local checkout 的更改与 local clone repo 不同,后者可以(但不是自动)与 (本地)远程仓库.*

(本地)远程仓库 被检入 /absolute/path/to/actual/<submodule> (或其他任何地方)的事实只是偶然的。它与 project 之间没有(直接)关系。

*:即更新 (local) remote repo 这样任何 project X 都可以合并对 project.

中的子模块所做的可互用更改

意味着对于 本地克隆回购 我可以有许多未推送的更改(分支等)并且是 project 的本地更改。其中一些我永远不想推送到 (本地) 远程仓库,因为它们不能在项目之间互用。

这是因为 git 子模块是一种将另一个 git 存储库的工作目录嵌入到您项目的工作目录中的方法,具有 git 所有代码管理功能规定。

路径 project/.git/modules/<submodule name> 是子模块的实际 git 存储库(相当于 "standard" 克隆的 project/.git),而 project/path/to/<submodule name> 是工作目录。这样做的原因是它允许您将 project/path/to/<submodule name> 的内容作为完整的 git 存储库进行操作(您可以签出新的提交,而不必以某种方式从其他位置复制它们)。

子模块,本质上,从项目的根目录中按照 git clone --separate-git-dir=.git/modules/<submodule name> <submodule origin> path/to/<submodule name> 的方式进行克隆。

值得注意的是,这仅存在于存储库的克隆 (non-bare) 版本中。实际存储库本身 确实 仅包含对子模块(路径、来源和提交)的引用。