【问题标题】:Get currently checked out full reference name in Git在 Git 中获取当前签出的完整参考名称
【发布时间】:2023-03-26 04:38:01
【问题描述】:

我需要一个命令来返回我当前签出的修订的完整参考名称。或者尽可能接近这个。如果只使用 git(用于跨平台目的),则大加分。

“完整参考名称”是指例如refs/tags/my-tag, refs/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)检查标签和特定哈希之间没有区别。 IE。 .git/HEAD 显示两种情况下的哈希值。
  • git show-ref 显示所有引用和相应的提交哈希
  • git symbolic-ref HEAD 适用于分支,使用 -q 选项,如果您不在分支上,它不会失败
  • git describe --tags --exact-match 适用于标签,但您需要在其前面加上 refs/tags 并去掉 stderr

相关:

我能找到的所有东西对于我正在寻找的东西来说似乎都太复杂了。

【问题讨论】:

  • 试试git branch --list。它会给你当前签出分支的名称。
  • “我需要一个命令来返回我当前签出的修订的完整参考名称。”对此的现代术语是“xy 问题”:您处于某种情况下,您已经根据对它的理解构想了一种处理该情况的方法,并且正在寻求实施帮助以解决该方法中的一个麻烦步骤-没有解释任何方法或动机——当真正的问题是你正在尝试一种到目前为止还不是最理想的方法时,根本就没有支持它。你能解释一下是什么促使了这种尝试吗?
  • @jthill 感谢您的帮助和描述,但我的问题是想要完全按照问题中的描述进行操作。提示我想知道该怎么做。
  • 好吧,我以前也曾有过闲散的好奇心,但我尽量不要将其称为“需要”,以免幽默的意图不那么含蓄。
  • 很公平,我想我想知道是否有一个命令...

标签: git


【解决方案1】:

您可能想要git describe,也许带有一些标志,也许带有一些后处理。请参阅下面的详细信息。


我不完全确定您要解决什么实际问题:

  • 哈希 ID 是 this 提交的永久名称。所以只需git rev-parse HEAD 就可以了。

  • 当前分支名称git symbolic-ref HEAD 得到的。如果没有当前分支名称,则会产生错误,每当您使用 git checkout 切换到 分离的 HEAD 时都会出现这种情况。其中包括:

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

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

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

如果您要解决的问题是:“提供一个对人类有用/可读的名称,这将(始终 | 当前)识别这个确切的提交”,没有正确的答案,但您能找到的最接近的答案是为当前提交哈希 ID 创建 您自己的新标签second-你能来的最接近的,它非常有用,是使用git describe 的输出(它有很多标志来调整它的输出)。请注意,使用分支名称只会识别相同的提交直到分支名称继续移动以识别某些其他提交,这会定期发生。

【讨论】:

  • 谢谢。我只是想知道这是否可能。我会将它用于“告诉我用户现在希望在哪里?-在标签/分支/提交上”之类的东西,所以你的第一个案例。但正确的答案是,这不仅仅是可能的。 reflog 很棒,但让事情变得非常复杂。
  • 嗯,这也是git status 尝试做的事情。如果有一个管道相当于“获取git status 会说的关于分支的事情”(第一行信息,on branch fooHEAD detached at/from ...),但没有 - 但你可以做git status | head -1,就是这么粗暴。
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 2014-11-25
  • 2010-11-27
  • 2011-09-08
  • 2015-05-14
  • 2010-11-25
  • 2017-08-11
相关资源
最近更新 更多