我正在寻找一个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
我只是想知道,这是最好的方法吗?感觉就像这样 可以使用一个命令。
答案 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
直接指向作为master
(master
是唯一本地参考)的祖父母的提交,那么
$ 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
为例返回。