Git 在哪里存储子模块提交的 SHA1?

我知道,当您将一个子模块添加到 git 存储库时,它会跟踪由其 sha1引用的子模块的特定提交。

我试图找到 sha1值存储在哪里。

.gitmodules.git/config文件只显示子模块的路径,而不显示提交的 sha1。

Git-子模块(1)引用只提到 gitlink条目,而 Gitmodule (5)引用也没有提到这一点。

42983 次浏览

它直接存储在 Git 的对象数据库中。子模块所在目录的树对象将有一个子模块提交的条目(这就是所谓的“ gitlink”)。

尝试执行 git ls-tree master <path-to-directory-containing-submodule>(或者只执行 git ls-tree master,如果子模块位于顶级目录中)。

存储子模块树对象的 对象数据库($GIT_DIR/objects/)最近正在发展:

使用 Git 2.34(Q42021) ,使“ git grep(< a href = “ https://git-scm.com/docs/git-grep”rel = “ nofollow norefrer”> man )递归到子模块的代码已经被更新,从 add 子模块对象存储迁移出来,作为替代对象存储机制(这是次优的)。

提交18a2f66犯罪现场调查,第三季,第8集提交0693806提交 dd45471提交78ca584犯下50d92b5提交8d33c3a犯下第三十五季第三集(2021年8月16日) by 谭(jhowtan)
(由 朱尼奥 · C · 哈马诺 gitster第11季,第5集合并,2021年9月20日)

submodule : 延迟地添加子模块 ODB 作为备用

签名: Jonathan Tan
校对: Emily Shaffer
审核人: Matheus Tavares

教 Git 只在第一次访问不在 the_repository,中的对象时,而不是在调用 add_submodule_odb()时,才将子模块 ODB 添加到 the_repository的对象存储中。

这提供了一种方法,通过显式传递子模块的存储库对象,从访问子模块的对象逐步迁移到访问子模块的对象。
任何 Git 命令都可以声明它可以通过调用 add_submodule_odb()来访问子模块对象(就像现在一样) ,但是子模块 ODB 本身直到需要时才会添加,因此可以逐个迁移单个命令和/或参数组合。

[显式存储库对象传递的优点是代码清晰(很清楚对象从哪个存储库读取)、性能(无论何时从任何存储库访问对象,无论是超级项目还是子模块,都不需要对所有子模块 ODB 进行线性搜索) ,以及未来可能出现部分克隆子模块等特性(现在不可能,因为如果缺少一个对象,我们不知道延迟获取到哪个存储库)。]

这个提交还引入了一个环境变量,一个测试可以设置使替代品的实际注册成为致命的,以证明其代码路径不需要这个注册。