如何仅 git status(或显示)子模块更改?

问题描述 投票:0回答:3
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时,我喜欢列出

仅子模块发生变化。请告诉我是否有更好的方法来做同样的事情。

git
3个回答
14
投票
这应该是适合您的解决方案:

git submodule foreach git status

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

这里

foreach [--recursive] <command>


  
  

评估每个签出子模块中的任意 shell 命令。该命令可以访问变量 $name、$path、$sha1 $toplevel: $name 是相关子模块部分的名称

.gitmodules

,$path是相对于子模块目录的名称
  超级项目,$sha1 是超级项目中记录的提交,
  $toplevel 是顶层的绝对路径
  超级项目。超级项目中定义但未定义的任何子模块
  此命令将忽略签出的内容。除非给出 
--quiet
,否则 foreach
  在执行命令之前打印每个子模块的名称。如果
  给定 
--recursive
,子模块将被递归遍历(即给定的 shell 命令也在嵌套子模块中进行评估)。 A
  任何子模块中命令的非零返回都会导致
  处理终止。这可以通过添加 || 来覆盖: 到
  命令结束。

作为示例,下面的命令将显示路径和当前 检查每个子模块的提交:

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



2
投票

git submodule status



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

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

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


0
投票

git status

 命令可以采用 
<pathspec>
,这样您就可以列出所有子模块,以便从超级项目的角度仅在子模块上具有状态。

# Get the list submodule # I use cut -c2- to ignore if the submodule start with a +,- or a space # The last cut allow to only output the submodule name mapfile -t submodule_list < <(git submodule status | cut -c2- | cut -d' ' -f2) # Merge the superproject git merge <branch_to_merge> # Status of submodule git status "${submodule_list[@]}"
    
© www.soinside.com 2019 - 2024. All rights reserved.