如何只显示子模块的git状态(或更改)?

11
git status --ignore-submodules=all

我正在寻找这个的反向操作,是否有一种方法只打印子模块更改?例如git status --show-only-submodules

编辑: 我的脚本获取并合并子模块更改,然后获取并合并超级项目更改。现在,我需要检查新拉入的超级项目更改是否包含子模块更改的SHA更新,为此我想在超级项目中执行git show HEAD^ HEAD,它会打印以下内容:

--- a/xyz
+++ b/xyz
@@ -1 +1 @@

-Subproject commit f991877822a8fd50b90f53894f2592a852039547
+Subproject commit f57c051f91b0948a5b8947430b516e650b50348e

从这里开始,我将采取 +Subproject commit 并进入 xyz 目录,执行 git log -1 --no-merges 并比较 SHAs,如果匹配,则假定超级更改包括已拉入的子模块更改。

因此,当我在超级项目中执行 git status --some-option 时,我喜欢列出 仅子模块更改。请让我知道是否有更好的方法来执行相同的操作。

2个回答

13
这应该是您的正确解决方案:
git submodule foreach git status

这将遍历所有子模块并执行给定的命令。来自这里:

foreach [--recursive] <command>

在每个签出的子模块中评估任意 shell 命令。该命令可以访问变量 $name、$path、$sha1 和 $toplevel: $name 是 .gitmodules 中相关子模块部分的名称,$path 是相对于超级项目的子模块目录名称,$sha1 是记录在超级项目中的提交,$toplevel 是超级项目顶层的绝对路径。此命令忽略在超级项目中定义但未签出的任何子模块。除非给出 --quiet,否则 foreach 在评估命令之前打印每个子模块的名称。如果给出 --recursive,则递归遍历子模块(即在嵌套子模块中评估给定的 shell 命令)。在任何子模块中从命令返回非零会导致处理终止。这可以通过在命令的末尾添加 || : 来覆盖。

例如,以下命令将显示每个子模块的路径和当前签出的提交:

git submodule foreach 'echo $path $(git rev-parse HEAD)'


谢谢,请看我的EDIT:部分,我现在添加了。看起来git submodule foreach 'echo $path $(git log -1 --format=format:%H --no-merges)'foreach中会给我提取的更改的sha,再次感谢。 - rodee
这与git status的预期行为无关。git status不会列出未更改的文件,而对于每个子模块,git submodule foreach git status会显示:“nothing to commit, working tree clean”。我理解为什么会这样,但这并没有改善情况。 - DimanNe

3

git submodule status

显示子模块的状态。将打印每个子模块当前检出提交的 SHA-1,以及子模块路径和 SHA-1 的 git 描述输出。如果子模块未初始化,则每个 SHA-1 可能带有前缀 -,如果当前检出的子模块提交与所在存储库索引中找到的 SHA-1 不匹配,则带有前缀 +,如果子模块存在合并冲突,则为 U。

如果指定了 --recursive,此命令将递归进入嵌套子模块,并显示它们的状态。

如果您只对当前已初始化的子模块相对于索引或 HEAD 记录的提交的更改感兴趣,则 git-status 和 git-diff 也会提供该信息(还可以报告对子模块的工作目录的更改)。


3
我认为 OP 对子模块的工作目录所做的更改感兴趣;正如最后一段所述,这些更改不会被 git-submodule-status 报告。 - Enrico Campidoglio

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