Git 打印头部的符号名称
我正在寻找一个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 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“(分离的头部)”