如果分离头指针,获取当前 Git 分支名称或提交哈希值。

3
有没有一条命令,如果当前在分支上则输出分支名(例如 master),如果是脱离状态则输出提交哈希值?目的是为了让我有东西可以记下来,以便稍后执行git switch <branch_or_commit>返回之前的位置。
这将用于编程,因此不得使用git status、Bash管道或任何其他方式进行抓取。答案需要使用“plumbing”命令,这些命令对其输出的格式和稳定性有保证。
还应该注意到,有很多问题分别询问每个问题,但没有同时询问。请认真思考再标记为重复。
已尝试的方法在表格中列出。最接近的实际上是cat .git/HEAD
你需要提供的答案:
```sh git branch --show-current 2>/dev/null || git rev-parse --short HEAD ```

cat .git/HEAD | sed 's/.*refs.heads.//' 怎么样? - joanis
我的意思是,我可以这样做。但我宁愿让 git 来做,因为我认为 .git/HEAD 的格式可能比看起来更复杂。 - Timmmm
除了这可能是一个有趣的练习之外,为什么你不能在程序中使用两个命令来配合 if 语句呢? ;) - TTT
只是为了好玩:git status | head -1 | awk '{print $NF}' - TTT
我可以 - 这就是最终我所做的。我只是想知道是否有更简单的方法。此外,爬取 git status 是一个不好的主意;该输出是为人类设计的。 - Timmmm
2个回答

6

只使用一条命令是不可能的,但使用两条命令则可行:

git symbolic-ref -q --short HEAD || git rev-parse HEAD

获取当前分支;但是如果处于脱离状态,则获取哈希值。


1
如果这是答案,那么问题就是重复的:https://dev59.com/V6fja4cB1Zd3GeqPsDNg - TTT
1
@TTT 是的,几乎是完全重复。但是 torek 在这里扩展了他之前的答案 here,所以让它保留吧。 - phd

4
目的是为了给我一些内容,让我可以记录下来,以便稍后执行git switch <branch_or_commit>返回到开始时的位置。
您需要知道所得到的内容是一个分支名还是提交哈希值,因为在使用哈希值时,git switch命令要求使用--detach标志,但是对于分支名称使用--detach将产生错误的结果。
因此,您需要知道您获取的是一个符号名称:
if switchname=$(git symbolic-ref -q --short HEAD); then
    detach=
else
    switchname=$(git rev-parse HEAD) || exit  # quit if unborn branch
    detach="--detach"
fi

之后:

git switch $detach $switchname

例如。

上面的方法存在一个缺陷:如果您在一个未创建的分支上,则git symbolic-ref -q --short HEAD将产生分支名称,但是git switch无法切换到该分支。最好同时运行git symbolic-refgit rev-parse HEAD来检测未创建的分支情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接