在Git中获取当前检出的完整引用名称

3

我需要一个命令,返回我当前检出的版本的完整引用名称。或者尽可能接近这个结果。如果是Git特有的(为了跨平台目的),那就更好了。

所谓“完整引用名称”,指的是例如refs/tags/my-tagrefs/heads/my-branch

示例:

git checkout master
magic command
# => /refs/heads/master

git checkout v1.0.0
magic command
# => /refs/tags/v1.0.0

git checkout 86742545e8152a8fbf31eafa55eb573042f61f5d
magic command
# => 

参考要点:

  • 我认为这是不可能 100% 准确的,因为(据我所知 git)检出标签和特定哈希没有区别。也就是说,.git/HEAD 在两种情况下都显示哈希值。
  • git show-ref 显示所有引用及其对应的提交哈希
  • git symbolic-ref HEAD 对分支有效,并且使用 -q 选项,如果您不在分支上,则不会失败
  • git describe --tags --exact-match 对标签有点用,但您需要在前面加上 refs/tags 并摆脱 stderr

相关链接:

所有我找到的东西都似乎太复杂了,不符合我的要求。


尝试执行 git branch --list 命令,它会返回当前检出分支的名称。 - Serge
我需要一个命令,可以返回我当前检出版本的完整引用名称。现代术语称之为“xy问题”:你处于某种情况下,基于你对它的理解,想出了一种处理该情况的方法,并在请求实现帮助时,针对该方法中的一个棘手步骤而没有解释任何方法或动机,而真正的问题是你正在尝试一种远非最佳的方法,因此根本没有支持。请问是什么促使您尝试这种方法? - jthill
@jthill 感谢您的帮助和说明,但我的问题是想要完全按照问题描述中所述去做。这是我在思考如何解决它时引发的。 - thisismydesign
嗯,我以前也曾被好奇心所驱使,但我尽量不将其称为“需求”,除非幽默意图不再那么隐晦。 - jthill
好的,我想知道是否有一个命令可以... - thisismydesign
1个回答

2
你可能需要使用git describe命令,可以加上一些标志或者后处理。具体细节见下文。
我不确定你要解决的实际问题是什么:
  • 哈希ID是这个提交的永久名称。所以只需运行git rev-parse HEAD即可得到它。

  • 当前分支名称是由git symbolic-ref HEAD获取的。如果没有当前分支名称,则会产生错误,这是每当您使用git checkout切换到分离的HEAD时的情况。这包括:

    • 检出非分支名称(例如标签名称或远程跟踪名称),
    • 使用--detach与分支名称,和
    • 使用原始哈希ID(当然)。

请注意,分支名称存储一个提交哈希ID,除了处于“未诞生的分支”状态的某种特殊情况外,在这种情况下,分支名称不存在,即使它是当前分支名称。这种有点讨厌的状态是必要的,因为分支名称必须包含现有提交的哈希ID,在新的、完全空的存储库中,还没有现有的提交,但是您已经开始在分支master上。

如果你要解决的问题是:“告诉我用户输入的命令以进入我现在所处的HEAD状态,无论是分离的还是附加的”,Git不会为你保存这个信息。你最接近的是在HEAD reflog中查找条目。这个reflog不是必须存在的。另一个查找的地方是由shell(命令行解释器)保存的历史记录:如果该历史记录存在,则它可能包含用户输入的确切命令,即使该命令是一个别名。

如果你要解决的问题是:“提供一个对人类有用/可读的名称,它将(总是|当前)标识这个确切的提交”,那么就没有正确的答案,但你可以最接近的方法是为当前提交哈希ID创建你自己的新标签。第二接近的方法,也非常有用,是使用git describe的输出(它有很多标志来调整其输出)。请注意,使用分支名称只能标识相同的提交,直到分支名称移动到标识一些其他提交为止,这种情况经常发生。


谢谢。我只是想知道这是否可能。我会用它来询问“告诉我用户现在期望在哪里?- 在标签/分支/提交上”,所以是您提到的第一种情况。但正确的答案是这不是简单的事情。reflog很好,但会让事情变得非常复杂。 - thisismydesign
1
这就是 git status 尝试做的事情。如果有一个类似于 "获取 git status 将要说的关于分支的信息"(第一行信息,如 on branch fooHEAD detached at/from ...)的管道等效工具将会很好,但是目前还没有 - 但是你可以使用 git status | head -1,尽管有些粗糙。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接