gpt4 book ai didi

git - 如何查看 git 子模块指向哪个提交

转载 作者:行者123 更新时间:2023-12-02 14:56:05 25 4
gpt4 key购买 nike

据我了解,如果您在 git 中添加子模块,那么主存储库将包含指向子模块的某个提交的指针。

有没有办法在不检查子模块代码的情况下查看主存储库指向特定子模块的哪个提交?

最佳答案

正如其他答案所解释的,您可以使用两个命令:

  • git submodule status ,或
  • git ls-tree HEAD ,仅取第二列为 commit 的行(如果你有 awk,你可以使用 git ls-tree HEAD | awk '$2 == "commit"' )。

但是,这些命令会给出不同的结果!

有什么区别?

  • git submodule status 始终报告当前状态(顾名思义),即当前 checkout 的提交。您在此处看到的哈希值与您通过进入子模块的目录1并检查最新提交(使用 git loggit rev-parse HEAD )看到的哈希值相同
  • git ls-tree HEAD 显示目标状态,不一定是当前状态。如果你想更新你的子模块,使它们对应于指定的版本,你必须使用 git submodule update .

什么会导致当前状态与目标状态不同?

它们不同的典型情况是当您git checkout时另一个分支/标签/提交,或者您使用 git pull更新您当前的分支。这两个命令都会导致 HEAD更新到对应的commit。现在,如果此提交指定您的子模块必须使用不同的版本,git submodule status仍会显示旧的,但显示 git ls-tree HEAD 所示的目标已经是新的了。

是否有更简单的方法来注意到它们不同步?

检查 git submodule status 的输出。 As the manual explains ,如果有 +哈希值之前,表示当前 checkout 的版本与目标版本不同。

如何使它们恢复同步?

通过运行git submodule update :将加载新的子模块,并且两个命令将指示相同的提交。

示例

例如,假设在我们的存储库中我们有一个名为 base 的子模块.
git submodule status的输出是(注意 + ):

+059ca6c4940813aa956e8668cb0af27efa189b22 base (release-1.2)

输出为git ls-tree HEAD

160000 commit fbc447ef9468def36cf4089094d6960cc51618b3 base

正如我们所看到的,哈希值是不同的。事实上,+已经通知我们了。

现在,如果我们输入 git submodule update ,它说:

Submodule path 'base': checked out 'fbc447ef9468def36cf4089094d6960cc51618b3'

现在我们可以使用的所有命令( git submodule statusgit ls-tree HEADgit log 中的 base )都指示 fbc447ef9468def36cf4089094d6960cc51618b3 ,并且没有 +在输出 git submodule status 的前面。如果我们运行 git submodule update再次,什么也没有发生,因为一切都已经是最新的,甚至没有任何输出。

<小时/>

1:检查子模块的提交时必须小心,因为它很棘手:找到子模块 base 中所做的最后一次提交。你不能使用git log base ,您必须输入该目录( cd base ),然后运行 ​​git log从那里。原因是第一个命令列出了“主”存储库的提交,这些提交设置了子模块的新版本,并且这些提交完全独立于子模块内进行的提交。

关于git - 如何查看 git 子模块指向哪个提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20655073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com