175

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

我正在尝试查找此 sha1 值的存储位置。

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

git-submodule(1)参考只提到了一个gitlink条目,而gitmodules (5)参考也没有说明这个问题。

4

2 回答 2

190

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

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

于 2011-02-17T20:05:38.243 回答
1

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

在 Git 2.34(2021 年第四季度)中,使“ git grepman递归到子模块的代码已更新,以从添加子模块对象存储迁移为替代对象存储”机制(这是次优的)。

请参阅Jonathan Tan ( )的提交18a2f66提交 e3e8bf0提交 0693806提交 dd45471提交 78ca584提交 50d92b5提交 8d33c3a提交 a35e03d(2021 年 8 月 16 日) 。(由Junio C Hamano 合并 -- --提交 11e5d0a中,2021 年 9 月 20 日)jhowtan
gitster

submodule: 懒惰地添加子模块 ODB 作为替代

签字人:Jonathan Tan
审核人:Emily Shaffer
审核人:Matheus Tavares

教 Git 添加子模块 ODB 作为对象存储的替代,the_repository仅在第一次访问不在其中的对象时才被调用,the_repository,而不是在add_submodule_odb()被调用时。

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

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

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

于 2021-10-04T20:21:46.970 回答