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

时间:2018-06-15 13:56:43

标签: git

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并比较SHA,如果它匹配,那么我将假设超级变化包括已拉入的子模块更改。

出于这个原因,我想在超级项目中git status --some-option时列出仅子模块更改。如果有更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:1)

git submodule status

  

显示子模块的状态。这将打印出的SHA-1   目前检查每个子模块的提交,以及   子模块路径和用于SHA-1的git描述输出。每   SHA-1可能会带有前缀 - 如果子模块不是   初始化,+如果当前检出的子模块提交没有   匹配包含存储库和U的索引中找到的SHA-1   如果子模块有合并冲突。

     

如果指定了--recursive,则此命令将递归到嵌套   子模块,并显示其状态。

     

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

答案 1 :(得分:1)

这应该是适合您的解决方案:

git submodule foreach git status

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

  

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)'