在 CLI 中优雅地显示分离的头部



我希望我的命令行(PS1变量(更优雅地显示分离的头部,即使它有点模棱两可。我想这样做的原因是,虽然我从不处理分离的分支,但由于我们的项目设置,我经常遇到它们,并且想知道它们来自哪个分支(或者至少是它们所在的分支(。

首先,我相信我对以下两者之间的区别有很好的理解:

  • 主人的头部提交
  • 一个分离的头部,恰好与master的头部相同

这就是这两个命令之间的区别:

git checkout master   # Checkout the master branch
git checkout master~0 # Checkout the commit from the head of the master branch

现在进入问题。目前,我的PS1末尾包含$(__git_ps1),命令行显示如下:

# git checkout master~1
addison:~/project ((111abcdef1...))$ 
# git checkout master~0
addison:~/project ((000abcdef0...))$ 
# git checkout master
addison:~/project (master)$ 

我想发生的是,如果我在一个分离的头上,能够找到一个具有匹配提交哈希的分支(首选master(,并显示分支名称,以及提交HEAD落后的距离,如下所示:

# git checkout master~1
addison:~/project (Detached(master~1))$ 
# git checkout master~0
addison:~/project (Detached(master))$ 
# git checkout master
addison:~/project (master)$ 

我知道可能还没有一个实用程序可以做到这一点,我已经准备好接受这一点 - 如果是这种情况,我想知道如何为提交哈希找到分支名称,以及分支HEAD提交它有多差。我知道可能有多个分支具有具有相同哈希的提交 - 我只想要一个"尽力而为"的解决方案。这可能意味着只选择最新的,或者最接近HEAD的,等等。

使用此信息,我可以创建自己的脚本并将其嵌入到我的$PS1变量中,并完全按照我想要的方式格式化它。


更新

我发现有一个选项可以用$(__git_ps1)设置,它可以将输出的格式更改为我想要的格式:

GIT_PS1_DESCRIBE_STYLE=contains # git describe --contains HEAD
GIT_PS1_DESCRIBE_STYLE=branch   # git describe --contains --all HEAD
GIT_PS1_DESCRIBE_STYLE=tag      # git describe --tags HEAD
GIT_PS1_DESCRIBE_STYLE=describe # git describe HEAD
GIT_PS1_DESCRIBE_STYLE=default  # git describe --tags --exact-match HEAD

如果我将选项设置为branch,那么输出的可读性要高得多。

正如您所指出的,没有完美的解决方案。 Git 本身使用两种方法。 一个示例是git status:当你在某个分支上时,HEAD包含分支名称,当你分离时,HEAD包含一个哈希 ID,但HEADreflog仍然包含分支名称,Git 可以扫描它并挑选出最近的分支,看看你是在该提交还是它的后代之一,然后说detached atnamedetached fromname1

但是,在您的情况下,您可能想要更像git describe所做的,只是按照不是git describe默认值的顺序。 在这种情况下,你想要的更像是git describe --contains所做的。--contains选项意味着--tags选项,该选项git describe查看所有标记,但不查看任何分支名称。 幸运的是,您可以添加--all

git describe --contains --all

它查看标记分支名称(以及其他引用,包括可能不是那么好的refs/stash(,并选择其中一个来描述当前提交。 所以这可能是 Git 内置的最接近你想要的东西。


1此功能在某些非常旧的 Git 版本中没有。 我不确定它何时首次出现,发行说明仅在描述 Git 2.4.0 的修复时提到了它。 在 2.4.0 之前,git branchgit status在何时以及如何说"分离"与"分离"方面存在分歧。 所以它在 2.4 及更高版本中,但早期版本不太擅长它,在某些时候,"分离/从"的东西根本不存在。

最新更新