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

时间:2013-12-18 10:06:33

标签: git git-submodules git-commit

据我所知,如果你在git中添加一个子模块,那么它指向该子模块中的某个提交。

有没有办法看看子模块指向哪个提交而不检查它?

4 个答案:

答案 0 :(得分:6)

如其他答案所述,您可以使用两个命令:

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

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

有什么区别?

  • git submodule status 总是报告当前状态(顾名思义),即当前已签出的提交。通过进入子模块的目录 1 并检查最新的提交(使用git loggit rev-parse HEAD),您在这里看到的哈希与您看到的哈希相同。 >
  • git ls-tree HEAD 显示目标状态,不一定是当前状态。如果要更新子模块以使其与指定版本相对应,则必须使用git submodule update

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

它们的典型不同之处是您git checkout另一个分支/标记/提交,或者您使用git pull更新当前分支。这两个命令都将导致HEAD更新为相应的提交。现在,如果此提交指定您的子模块必须使用其他版本,则git submodule status仍将显示旧版本,而git ls-tree HEAD显示的目标将已经是新版本。

是否有一种更简单的方法来通知它们不同步?

检查git submodule status的输出。 As the manual explains,如果井号前面有+,则表示当前签出的版本和目标版本不同。

如何使它们恢复同步?

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

示例

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

  

+ 059ca6c4940813aa956e8668cb0af27efa189b22基本版本(1.2版)

git ls-tree HEAD的输出是

  

160000提交fbc447ef9468def36cf4089094d6960cc51618b3基本

我们可以看到,哈希值是不同的。实际上,+已经通知了我们。

现在,如果我们输入git submodule update,它会显示:

  

子模块路径'base':检出'fbc447ef9468def36cf4089094d6960cc51618b3'

现在我们可以使用的所有命令(git submodule status内部的git ls-tree HEADgit logbase)都表示fbc447ef9468def36cf4089094d6960cc51618b3,而没有{{ 1 {}前面的+输出中。如果我们再次运行git submodule status,则什么也不会发生,因为一切都已经是最新的,甚至没有任何输出。


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

答案 1 :(得分:4)

更直接的命令是:

git submodule status

答案 2 :(得分:3)

...不确定

git ls-tree <commit>:<path to dir that has a submodule as a subdir>

示例:git ls-tree HEAD:src/thirdparty

或者只是:git ls-tree -r HEAD看一切。

子模块将显示为commit类型(与通常的blobtree相对)。

答案 3 :(得分:0)

git ls-tree -r <submodule-commitID-of-interest> <submodule-path> | awk '{print $3}'

这里有 bash 行,用于打印最后 10 个子模块的提交 ID 指向的子模块的 repo 提交 ID:

git --no-pager log -10 --pretty="%H" <submodule-path> | while read i; do git ls-tree -r $I <submodule-path> | awk '{print $3}'; done