git show 显示特定标签的子模块提交 ID

git show to display submodule commit ID for a specific tag

我正在尝试找出在我的项目中创建的每个版本的子模块提交 ID。所以我打算编写一个脚本来遍历 git 标签,然后执行以下命令:

 $ git show V1.2.3.4:Files/targetdir/dbscripts
 fatal: bad object V1.2.3.4:Files/targetdir/dbscripts

如果我尝试一个不是子模块的不同路径,它工作正常。除了使用 git 结帐暴力破解解决方案,我有什么选择?

谢谢!

您可以通过以下方式间接获取该信息:

git cat-file -p <revision>:<directory containing submodule>

micropython项目为例,我们看到如下子模块:

$ git submodule
 43a6e6bd3bbc03dc501e16b89fba0ef042ed3ea0 lib/axtls (remotes/origin/micropython-2.1.3)
 35aaec4418ad78628a3b935885dd189d41ce779b lib/berkeley-db-1.xx (remotes/origin/embedded)
 e9de7e35f2339598b16cbb375f9992643ed81209 lib/libffi (v3.2.1-146-ge9de7e3)
 92f23d6ca0971a32f2085b9480e738d34174417b lib/lwip (STABLE-2_0_3_RELEASE)
 293f553ed9551c1fdfd05eac48e75bbdeb4e7290 lib/nrfx (v1.1.0)
 f690e03b53839c055ffc021ec4c9c1ac45b5b7d6 lib/stm32lib (F0-1.9.0+F4-1.16.0+F7-1.7.0+H7-1.2.0+L4-1.8.1-14-gf690e03)

如果我想在标签 1.0.0 中查看 lib/axtls 的版本,我可以这样做 这个:

$ git cat-file -p 1.0.0:lib

这让我:

100644 blob e719821bfc7fa2e43624bce6a49494fb9c979539    README.md
160000 commit 67d27df4b5d097e146599fc4fb160a2adcbf5632  axtls
160000 commit dab957dacddcbf6cbc85d42df62e189e4877bb72  berkeley-db-1.xx
040000 tree 781cb0c2cb85996792d7fdef496771dc00318658    cmsis
040000 tree 197df18400ba59e6fc9239cb092ebe5297fc6038    embed
040000 tree 31352b2af11cebf4699621325099328fd83ceb87    fatfs
040000 tree e6c32aad43f98da3a3b87c21b5af7d0f115fe290    libc
160000 commit e9de7e35f2339598b16cbb375f9992643ed81209  libffi
040000 tree 92a3d42de877598a24f46059d0dfeed9614fe7a4    libm
160000 commit 5b8b5d459e7dd890724515bbfad86c705234f9ec  lwip
040000 tree e747bbd2cea7f36bc6a77f73409bdb98062f2b06    memzip
040000 tree 33f546df4dfba0ae41a2c4c9ee9bfc261d8642e2    mp-readline
040000 tree 3089a08f2a61d61583bac5d4b60dcfdf50140d3b    netutils
040000 tree 1d10d514d7e2df771409b740c4f175954f772f9b    timeutils
040000 tree cfa226ef2b8f198cbcd8e4b2f42d4164bf7b7f9c    utils

可以看到axtls目录下有一个commit对象, 其中散列是与该子模块关联的提交 ID。所以我 可以只获得修订中 lib/axtls 子模块的提交 1.0.0 像这样:

$ git cat-file -p 1.0.0:lib | awk ' == "axtls" {print }'
67d27df4b5d097e146599fc4fb160a2adcbf5632

不要使用 show,使用 rev-parse。 Show 将 V1.2.3.4:Files/targetdir/dbscripts 解析为一个 id 并尝试向您显示其内容,rev-parse 仅向您显示该 id。子模块内容根据定义在单独的历史记录中,仅记录其 ID,并且您可能不会在当前存储库中携带历史记录本身(尽管您可以,这是我使用和喜欢的特技,携带实用程序和测试库主仓库中作为分支的历史)。