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

Posted

技术标签:

【中文标题】Git 在哪里存储子模块提交的 SHA1?【英文标题】:Where does Git store the SHA1 of the commit for a submodule? 【发布时间】:2011-06-29 08:09:17 【问题描述】:

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

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

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

git-submodule(1) 引用仅提及 gitlink 条目,gitmodules(5) 引用也未提及此内容。

【问题讨论】:

见***.com/questions/3983829/… 【参考方案1】:

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

尝试使用git ls-tree master <path-to-directory-containing-submodule>(如果子模块位于***目录中,则只使用git ls-tree master)。

【讨论】:

是的。我知道它现在在哪里。它匹配来自git submodule status 的id。谢谢。 在合并过程中它们存储在哪里并且子模块发生冲突? @AdamDymitruk,你找到答案了吗? 为什么不发布一个新问题,伙计们? :-) 有没有办法在不更新工作树的情况下更改此提交 ID 以指向其他内容?【参考方案2】:

存储子模块树对象的object database($GIT_DIR/objects/)最近正在进化:

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

参见commit 18a2f66、commit e3e8bf0、commit 0693806、commit dd45471、commit 78ca584、commit 50d92b5、commit 8d33c3a、commit a35e03d(2021 年 8 月 16 日)Jonathan Tan (jhowtan)。(由Junio C Hamano -- gitster -- 合并于commit 11e5d0a,2021 年 9 月 20 日)

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

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

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

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

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

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

【讨论】:

以上是关于Git 在哪里存储子模块提交的 SHA1?的主要内容,如果未能解决你的问题,请参考以下文章

Git修改子模块的路径

Git 子模块提交钩子

将子模块更新为最新的提交

Xcode Bots 不会将 git 子模块更新为指定的提交

如何为子模块更新编写 git 提交消息?

为啥 git 子模块与 svn 外部不兼容?