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

Posted

技术标签:

【中文标题】如何让 git bash 在子模块中显示分支名称【英文标题】:How to make git bash show branch name in submodules 【发布时间】:2021-08-23 08:41:38 【问题描述】:

Git bash 将分支名称显示为

 (master)

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

 ((445c03f...))

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

【问题讨论】:

这能回答你的问题吗? How can I specify a branch/tag when adding a Git submodule? @Eng_Farghly ***.com/a/55570998/7976758 ***.com/search?q=%5Bgit-submodules%5D+detached+HEAD 【参考方案1】:

Rule for beginners: Submodules don't use branch names. Rule for advanced Git users: Submodules don't use branch names yet. ?(请参阅链接以在此处收集单词 yet 的含义。)

正如phd linked to in a comment 指出的answer,Git 子模块通常处于分离头模式。当你进入子模块时,你所看到的——分离的 HEAD 的哈希 ID 就是现实。在此处显示分支名称可能是一种美丽的错觉,但请注意美丽的错觉:它们可能会让您走在一条漂亮的黄砖路上,实际上只是从悬崖上掉下来。

这里的总体思路是,超级项目提交 规定了应该签出的内容。毕竟,超级项目的文件就是这种情况:如果你在超级项目中git checkout a123456,你会得到提交a123456的所有文件。1如果该提交需要在子模块sub/mod 中提交b789abc,那么sub/mod 是否也应该检出提交b789abc2

所有这些在 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:您必须运行@ 987654336@。设置递归选项会使这个——我的意思是git checkout/git switch——表现得很好,但是因为子模块是如此的僵硬、脆弱和混乱,我不太喜欢设置递归选项.

【讨论】:

以上是关于如何让 git bash 在子模块中显示分支名称的主要内容,如果未能解决你的问题,请参考以下文章

Git Bash 提示 - 当前分支名称在 Git 命令后停止显示

如何在我的 PowerShell 提示符中显示我当前的 git 分支名称?

Git在添加主存储库之前恢复主存储库后未删除子模块

在子模块内添加 git 子模块(嵌套子模块)

在 Shell 提示符中显示 Git 分支名称

让 shell 显示当前 git 的分支名称