Git 用于检测子模块更新并获取暂存区或工作目录中的哈希值的管道命令

Git plumbing commands to detect submodule update and get the hashes in staging area or working directory

在陶瓷模式下,git diff 通告子模块更改:

$ cd /opt/staging # This is the main Git repository
$ cd software/zemke-rhyne # This is a submodule
$ git pull
$ git diff                                                                                                                  
diff --git a/software/zemke-rhyne b/software/zemke-rhyne
index 0fff2fc..cb69287 160000
--- a/software/zemke-rhyne
+++ b/software/zemke-rhyne
@@ -1 +1 @@
-Subproject commit 0fff2fc52bdc2a62a2647110e712b1b3baa48613
+Subproject commit cb69287a3540054ff85cd14199cf36b4b5098c1a

哪些管道命令可以提供以下信息?

例如,目标是自动提交消息以通过 git rev-list 简要记录更新子模块中的更改。

为了查明子模块是否更新,可以使用

$ git diff-files --quiet software/zemke-rhyne

退出状态将指示子模块是最新的 (0) 还是过时的 (1)。

旧散列例如显示为 ls-tree:

$ git ls-tree @ software/zemke-rhyne
160000 commit 0fff2fc52bdc2a62a2647110e712b1b3baa48613  software/zemke-rhyne

另一种方式是

$ git ls-files -s software/zemke-rhyne
160000 0fff2fc52bdc2a62a2647110e712b1b3baa48613 0   software/zemke-rhyne

(有什么区别?如果有人能评论就太好了……)

还有一种方法可以查明子模块是否已更新 先前的哈希值。如果子模块未修改,则以下命令的输出为空,否则如下所示:

$ git diff-files software/zemke-rhyne
:160000 160000 0fff2fc52bdc2a62a2647110e712b1b3baa48613 0000000000000000000000000000000000000000 M  software/zemke-rhyne

不幸的是,diff-files 错过了同时显示更新后的哈希值的绝佳机会。要查看它,我所能想到的就是在子模块目录中使用 rev-list 。这似乎有点不优雅和脆弱......

$ git -C software/zemke-rhyne rev-list -n 1 @
cb69287a3540054ff85cd14199cf36b4b5098c1a