打印HEAD的符号名称

时间:2014-12-23 06:24:30

标签: git branch symbolic-references

我正在寻找一个Git命令,它将打印HEAD的符号名称。一世 正在使用此命令

$ 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

所以现在我有了这个,它涵盖了新的repos和旧的提交

$ git symbolic-ref -q --short HEAD || git name-rev --name-only HEAD
master

我只是想知道,这是最好的方法吗?感觉就像这样 可以使用一个命令。

2 个答案:

答案 0 :(得分:10)

你写道:

  

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

以下内容可能足以证明您所要求的内容在所有情况下都没有意义,只是因为HEAD可能与一个引用无明确关联。请继续阅读。

git name-rev做什么

git-name-rev man-page中,您会找到以下说明:

  

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

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

让我们来看看

$ git name-rev --name-only <commit-ish>

在不同的情况下会发生(--name-only标志是偶然的,因为它的效果纯粹是装饰性的。)

HEAD未分离的情况

如果HEAD没有脱离,i.o.w。如果HEAD指向有效的引用(让我们称之为myref),那么就没有歧义:正在运行

$ git name-rev --name-only HEAD

简单输出

myref

因为myref引用明确与HEAD相关联。到目前为止,非常好。

HEAD 分离

的情况

在这种情况下,事情并不那么简单。实际上,可能有一个或多个引用可以从<commit-ish>到达,或者根本没有引用。

存在一个或多个此类本地引用的情况

在第一个这样的本地参考文献中,git name-rev打印了一个&#34;亲戚&#34;符号引用,即表格的修订

<ref>~<n>

其中<ref>代表有问题的本地参考,<n>代表生成。例如,如果HEAD直接指向作为mastermaster是唯一本地参考)的祖父母的提交,那么

$ git name-rev HEAD

返回

master~2

但请注意,如果<commit-ish>可以从多个引用中访问,git name-rev返回的引用有点武断,因为它只是由字典顺序决定的(其中命令检查本地引用)。

没有此类本地参考的情况

很容易想象可以从任何本地引用都无法访问<commit-ish>的情况。实际上,这里有一个你可以在家里复制的(样板标准输出被省略):

# set things up
$ mkdir test
$ cd test
$ git init

# create a commit
$ touch README.md
$ git add README.md
$ git commit -m "add README"

# detach the HEAD (make it point directly to the tip of master, instead of to master itself)
$ git checkout $(git rev-parse master)

# create a second commit (while in detached-HEAD state)
$ printf "foo\n" > README.md
$ git commit -am "write 'foo' in README"

# attempt to find a symbolic name for HEAD 
$ git name-rev --name-only HEAD
undefined

因为提交DAG如下所示,

A [master]
 \
  B [HEAD]
无法从唯一引用(B)访问

提交master;因此,git name-rev放弃并简单地返回undefined

结论

由于HEAD无法保证明确地与一个参考相关联,因此您要求的内容没有意义:p

答案 1 :(得分:5)

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

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

这包括分支,标签,分离头(提交)和新存储库。但标签将以tags/0.1.0为例返回。