Git 打印头部的符号名称

Git 打印头部的符号名称,git,branch,symbolic-references,Git,Branch,Symbolic References,我正在寻找一个Git命令,它将打印头的符号名。我 他正在使用这个命令 $ git name-rev --name-only HEAD master $ git checkout HEAD~2 $ git name-rev --name-only HEAD master~2 但是,我注意到它在新的存储库上不起作用 $ git init $ git name-rev --name-only HEAD Could not get sha1 for HEAD. Skipping. 我找到了这个解决办

我正在寻找一个Git命令,它将打印
头的符号名。我
他正在使用这个命令

$ git name-rev --name-only HEAD
master
$ git checkout HEAD~2
$ git name-rev --name-only HEAD
master~2
但是,我注意到它在新的存储库上不起作用

$ git init
$ git name-rev --name-only HEAD
Could not get sha1 for HEAD. Skipping.
我找到了这个解决办法

$ git init
$ git symbolic-ref --short HEAD
master
但这在较旧的提交上不起作用

$ git checkout HEAD~2
$ git symbolic-ref --short HEAD
fatal: ref HEAD is not a symbolic ref
$ git symbolic-ref -q --short HEAD || git name-rev --name-only HEAD
master
现在我有了这个,它涵盖了新的回购协议和旧的承诺

$ git checkout HEAD~2
$ git symbolic-ref --short HEAD
fatal: ref HEAD is not a symbolic ref
$ git symbolic-ref -q --short HEAD || git name-rev --name-only HEAD
master
我只是想知道,这是最好的方法吗?感觉应该这样 只需一个命令即可。

您可以编写:

我正在寻找一个Git命令,它将打印
头的符号名

以下内容可能足以证明您所要求的并非在所有情况下都有意义,这仅仅是因为
HEAD
可能无法明确地与一个引用关联。继续读下去

git name rev
有什么作用 在中,您可以找到以下描述:

给定一个提交,找出它相对于本地引用的位置。[……]

更具体地说,
git name rev
检查是否可以从任何本地引用中访问
(通过按字典顺序处理它们,例如
master
之前开发

让我们检查一下什么

$git name rev--仅限名称
在不同的情况下执行(此处附带使用
--name only
标志,因为其效果纯粹是装饰性的)

头部未分离的情况
如果
HEAD
未分离,则i.o.w.如果
HEAD
指向有效的ref(我们称之为
myref
),则不存在歧义:正在运行

$git name rev--仅名称头
简单输出

myref
因为
myref
引用与
HEAD
明确关联。到目前为止,一切顺利

拆下
头部
的情况
在这种情况下,事情就不那么简单了。事实上,可能有一个或多个可以访问
的引用,或者根本没有

存在一个或多个此类本地引用的情况 在第一次找到此类本地引用时,
git name rev
打印一个“相对”符号引用,即表单的修订版

<ref>~<n>
返回

master~2
但是,请注意,如果可以从多个引用访问
,则由
git name rev
返回的引用会有些随意,因为它只由字典顺序(命令检查本地引用)决定

没有此类本地参考的情况 很容易想象这样的情况,
从任何本地引用都无法访问。实际上,这里有一个你可以在家里复制的(样板stdout被省略):

#把事情安排好
$mkdir测试
$cd测试
$git init
#创建提交
$touch README.md
$git add README.md
$git commit-m“添加自述”
#分离头部(使其直接指向master的尖端,而不是master本身)
$git checkout$(git版本解析主控)
#创建第二次提交(处于分离头状态时)
$printf“foo\n”>README.md
$git commit-am“在自述文件中写入'foo'”
#尝试查找头的符号名称
$git name rev--仅名称标题
未定义
因为commit DAG如下所示

A [master]
 \
  B [HEAD]
无法从唯一引用(
master
)访问提交
B
;因此,
gitname rev
放弃,只返回
undefined

结论
因为
不能保证与一个引用明确关联,所以您所要求的没有意义
:p

只想为您的案例添加我的解决方案:

git symbolic-ref -q --short HEAD || git describe --all --always HEAD

这包括分支、标记、分离头(提交)和新存储库。但是标签将以
标签/0.1.0
的形式返回。

我不确定您的问题是否存在。如果您的头部被分离,
git name rev--name only HEAD
只会给您一个“相对”的符号引用(因为缺少更好的术语)。严格地说,在分离头状态下(如在第一个代码块中的第二个命令之后),没有与
明确关联的符号名。请添加预期输出(提交ID、标记名(如果存在)、分支名、所有分支名(如果适用))好吗?为什么您希望提交和引用出现在原始的repo中?如果签出了分支,这个命令就可以了。但是,它在分离的头部状态下不起作用,因为在分离
头部时请求与
头部相关联的符号名根本没有意义。分离的头部状态由
|
替代项处理。另一种说法是:
git-symbolic-ref-short-HEAD-q | | echo“(分离的头部)”