如何使 git bash 在子模块中显示分支名称

How to make git bash show branch name in submodules

Git bash 显示分支名称为

 (master)

但是当使用子模块时,它现在显示哈希而不是名称,例如:

 ((445c03f...))

如何让它在子模块中显示分支名称?

Rule for beginners: Submodules don't use branch names. Rule for advanced Git users: Submodules don't use branch names yet.(请参阅 link 以了解此处 yet 一词的含义。)

answer that 所述,Git 子模块 通常 在分离头模式下。当您进入子模块时,您所看到的——分离的 HEAD 的哈希 ID——是真实的。在这里显示分支名称可能是一种美丽的错觉,但要小心美丽的错觉:它们可能会让你走在一条漂亮的黄砖路上,实际上只是从悬崖上掉下来。

这里的总体思路是,超级项目提交 决定了应该签出的内容。毕竟, 超级项目的 文件就是这种情况:如果您在超级项目中 git checkout a123456,您将获得提交 a123456 的所有文件。1 如果该提交需要子模块 sub/mod 中的提交 b789abc,难道 sub/mod 不应该也检出提交 b789abc 吗?2

在 Git 中,所有这一切的实际实施都存在重大缺陷。这让我想起了一家满是缺少 safety guards 的电动工具的商店。 git submodule update 命令 可以 使用分支名称,但它使用分支名称的方式令人困惑(在某些上下文中是明智的,但令人困惑)。如果你想使用子模块,尽量将它们视为只读的“从这个存储库获取这个提交”操作,因为那是 Git 倾向于对它们做的。


1嗯,也就是说,只要我们不玩聪明的索引和工作树技巧,如 Checkout another branch when there are uncommitted changes on the current branch.

中所示

2但是,除非您使用 --recursive 或设置各种选项,否则 git checkout 不会 自动签出 b789abc:你必须 运行 git submodule update。设置递归选项使这个——this 我的意思是 git checkout / git switch——表现良好,但因为子模块是如此僵硬、脆弱和混乱,我不不太喜欢设置递归选项。