git 子模块状态显示错误的标签/分支

Add*_*son 9 git git-submodules

当我运行该命令时git submodule status,我看到对几个月甚至几年前标签的引用。其他一切都工作正常(代码检查了我的期望,并且没有其他奇怪的行为)。

问题是该命令显示不正确。一切正常。总是得到我所期望的,并且我经常使用和git submodule update更新子模块。git addgit push

username:~/src/main (master)$ git submodule status
 3f786850e387550fdab836ed7e6dc881de23001b module0 (old-tag-1234-g8f123456)
 89e6c98d92887913cadf06b2adb97f26cde4849b module1 (years-old-tag-4321-g12f4567890)
 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69 module2 (heads/master)
 e983f374794de9c64e3d1c1de1d490c0756eeeff module3 (heads/master)
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我的所有子模块都已master签出分支。我希望这个命令能够显示heads/master所有 4 个模块。

username:~/src/main/module0 (master)$ git status 
On branch master
Your branch is up to date with 'origin/master'.

...

username:~/src/main/module3 (master)$ git status 
On branch master
Your branch is up to date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)

这些子模块也被正确引用 -git submodule update不会导致对它们进行任何更改。这是一个每天由数十人更新数十次的存储库 - 我们不小心使用 3 年前的代码或忘记更新它的可能性为零。

进一步强调:问题是该命令显示不正确。一切正常

任何人都可以提出原因吗?我怀疑这可能与需要对所有事情进行操作有关update-ref,或者与某些陈旧的参考有关~/src/main/.git/modules/module0/info/refs

Ste*_*ker 1

在将我的Pico C/C++ SDK克隆更新到主分支上的最新提交后,我刚刚遇到了同样的问题。这是我根据评论中的建议提出的解决方案。

标准答案git submodule status暗示子模块因更新btstack降级

$ git submodule status
 72ef1732c954d938091467961e41f4aa9b976b34 lib/btstack (v1.4-2371-g72ef1732c)
 8ef38a6d32c54f850bff8f189bdca19ded33792a lib/cyw43-driver (v1.0.1)
 239918ccc173cb2c2a62f41a40fd893f57faf1d6 lib/lwip (STABLE-2_1_0_RELEASE-548-g239918cc)
 a77287f8fa6b76f74984121fdafc8563147435c8 lib/mbedtls (v2.28.1-36-ga77287f8f)
 86c416d4c0fb38432460b3e11b08b9de76941bf5 lib/tinyusb (0.15.0)
Run Code Online (Sandbox Code Playgroud)

解决方案使用git submodule foreach揭示了真实的真相

注意假设读者使用的是 *NIX shell,如 bash)

$ git submodule foreach --quiet 'echo "" $(git rev-list -n1 HEAD) $sm_path $(git describe --all | sed "s,^tags/,(,;s/$/)/")'
 72ef1732c954d938091467961e41f4aa9b976b34 lib/btstack (v1.5.6.1-1-g72ef1732c)
 8ef38a6d32c54f850bff8f189bdca19ded33792a lib/cyw43-driver (v1.0.1)
 239918ccc173cb2c2a62f41a40fd893f57faf1d6 lib/lwip (STABLE-2_1_0_RELEASE-548-g239918cc)
 a77287f8fa6b76f74984121fdafc8563147435c8 lib/mbedtls (v2.28.1-36-ga77287f8f)
 86c416d4c0fb38432460b3e11b08b9de76941bf5 lib/tinyusb (0.15.0)

Run Code Online (Sandbox Code Playgroud)

当然,添加 sed 只是为了匹配命令的输出而做的糖衣。

编辑

为了让读者免于引用地狱。与 git别名(模块状态)相同的内容包含在~/.gitconfig

[alias]
...
   sms = submodule foreach --quiet 'echo \"\" $(git rev-list -n1 HEAD) $sm_path $(git describe --all | sed -e s,^tags/,\\(, -e s/$/\\)/)'
...
Run Code Online (Sandbox Code Playgroud)
$ git sms
 72ef1732c954d938091467961e41f4aa9b976b34 lib/btstack (v1.5.6.1-1-g72ef1732c)
 8ef38a6d32c54f850bff8f189bdca19ded33792a lib/cyw43-driver (v1.0.1)
 239918ccc173cb2c2a62f41a40fd893f57faf1d6 lib/lwip (STABLE-2_1_0_RELEASE-548-g239918cc)
 a77287f8fa6b76f74984121fdafc8563147435c8 lib/mbedtls (v2.28.1-36-ga77287f8f)
 86c416d4c0fb38432460b3e11b08b9de76941bf5 lib/tinyusb (0.15.0)
Run Code Online (Sandbox Code Playgroud)