gpt4 book ai didi

git - 打印 HEAD 的符号名称

转载 作者:太空狗 更新时间:2023-10-29 12:57:01 25 4
gpt4 key购买 nike

我正在寻找一个 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

所以现在我有了这个,它涵盖了新的 repo 协议(protocol)和旧的提交

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

我只是想知道,这是最好的方法吗?感觉应该是这样一个命令就可以实现。

最佳答案

你写:

I am looking for a Git command that will print the symbolic name for HEAD.

以下可能足以证明您的要求并非在所有情况下都有意义,仅仅是因为 HEAD可能不会明确地与一个引用文献相关联。继续阅读。

什么git name-rev

git-name-rev man-page ,您会发现以下描述:

Given a commit, find out where it is relative to the local refs. [...]

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

让我们检查一下

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

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

案例 HEAD不分离

如果HEAD不分离,i.o.w.如果HEAD指向一个有效的 ref(我们称它为 myref ),那么就没有歧义:运行

$ git name-rev --name-only HEAD

简单输出

myref

因为 myref引用明确与 HEAD 相关联.到目前为止,还不错。

案例 HEAD 分离的

那样的话,事情就不那么简单了。事实上,<commit-ish> 可能有一个或多个引用文献是可达的,或者可能根本就没有。

存在一个或多个这样的本地引用的情况

在找到第一个这样的本地引用时,git name-rev打印“相对”符号引用,即表格的修订

<ref>~<n>

哪里<ref>代表相关的本地引用,<n>代表一代。例如,如果 HEAD直接指向作为 master 的祖 parent 的提交(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

关于git - 打印 HEAD 的符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27615126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com