Git - 子模块,跟踪要使用的子模块提交

3
“ 超级”存储库在哪里跟踪每个子模块所处的提交位置?
我在.gitmodules中没有看到任何有关此信息的内容。
我想要实现的是,如果我使用1.0-alpha等标签来标记“超级”存储库,则它将记住所有子模块在那个时间点上所处的提交状态,因此当我稍后检出该标记时,也会将子模块放置在其正确的提交位置。
是否可以在不手动记录每个子模块的提交位置的情况下实现这一点?
我现在意识到以后我可以通过使用以下方法获取该信息:
git ls-tree <tag>

但是我将不得不进入每个子模块并手动检出该特定子模块在提交abc1234时的代码。

/David

1个回答

4

子模块的当前提交哈希存储在与主项目提交相关联的树对象中。如果在主项目中执行 git ls-tree -r HEAD 命令,则每个子模块都由以下格式的一行表示:

160000 commit <hash> <path/to/submodule>

这一行指示了子模块中应该检出的提交记录,以匹配主存储库中的提交记录。


这有点像我在问题中所说的... 但这意味着如果我想回到一个标签,并让它与包含的子模块一起工作,我必须手动进入那些子模块并将它们重置为“超级”项目标记时的提交吗? - netdigger
不,当你在主项目中执行git checkout whatever之后,你需要运行git submodule update,它会查看主项目中的提交,并检出子模块中所需的任何内容。 - twalberg
谢谢。在切换分支后,我忘记了如何获取适当的子模块版本!你知道这些信息保存在哪里(子模块所在的提交位置)吗? - netdigger
1
子模块当前检出的提交存储在与该子模块相关联的 git 目录中的 HEAD 引用中,这取决于您使用的 git 版本。它曾经存储在 path/to/submodule/.git 中,但是新版本将 git-dir 和子模块的工作树分离,因此现在它位于主存储库中的 .git/modules/path/to/submodule... - twalberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接