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 submodule foreach git status
这将遍历所有子模块并执行给定的命令。从
这里:
评估每个签出子模块中的任意 shell 命令。该命令可以访问变量 $name、$path、$sha1 $toplevel: $name 是相关子模块部分的名称
foreach [--recursive] <command>
.gitmodules
,$path是相对于子模块目录的名称 超级项目,$sha1 是超级项目中记录的提交, $toplevel 是顶层的绝对路径 超级项目。超级项目中定义但未定义的任何子模块 此命令将忽略签出的内容。除非给出--quiet
,否则 foreach 在执行命令之前打印每个子模块的名称。如果 给定--recursive
,子模块将被递归遍历(即给定的 shell 命令也在嵌套子模块中进行评估)。 A 任何子模块中命令的非零返回都会导致 处理终止。这可以通过添加 || 来覆盖: 到 命令结束。作为示例,下面的命令将显示路径和当前 检查每个子模块的提交:
git submodule foreach 'echo $path $(git rev-parse HEAD)'
显示子模块的状态。这将打印 SHA-1 当前检查了每个子模块的提交以及 子模块路径和 git 的输出描述了 SHA-1。每个 如果子模块不是,SHA-1 可能会带有 - 前缀 已初始化,+ 如果当前签出的子模块提交没有 匹配在包含存储库的索引中找到的 SHA-1 和 U 如果子模块有合并冲突。如果指定了--recursive,该命令将递归到嵌套 子模块,并显示它们的状态。
如果您只对当前初始化的更改感兴趣 与索引或记录中记录的提交相关的子模块 HEAD、git-status 和 git-diff 也会提供该信息 (还可以报告子模块工作树的更改)。
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[@]}"