以编程方式检查HEAD是否分离?

19
我想知道在脚本中是否处于“HEAD分离”状态。
当前,我解析git status的输出,但我不喜欢这样做,因为我听说解析Git输出是一个不好的实践——我想要一个面向程序的接口来告诉我是否HEAD已分离。 我也不想手动查看.git/HEAD或者解析git description或者git branch
有什么想法吗?

请见 https://dev59.com/r2w05IYBdhLWcg3w3lkl。 - Lasse V. Karlsen
你可以尝试运行 git rev-parse --symbolic-full-name HEAD 命令,如果输出的是 HEAD,则说明你处于分离头指针状态;如果输出的是某个分支名,则说明你在该分支上。 - Lasse V. Karlsen
1
如果你在一个分支上,git rev-parse --abbrev-ref HEAD 将会给你分支名;否则,它将会给你脱离 HEAD 的哈希值。 - clamentjohn
4个回答

21

最简单的命令可能是:

$ git symbolic-ref -q HEAD

并检查退出状态:0表示正常,1表示分离。

git-symbolic-ref 文档中:

-q, --quiet
   Do not issue an error message if the <name> is not a symbolic ref
   but a detached HEAD; instead exit with non-zero status silently.

很棒的解决方案。我就选这个了。 - iBug

8

在编程中,你需要为Git协议编写一个包装器。

例如,通过GitPython,你可以找出仓库是否分离或者不分离 repo.head.is_detached


我没有提到我使用的编程语言。它可能是 Bash,其中唯一的接口是 git 二进制文件。这很好 - 一旦你知道如何在 Bash 中做到这一点,你就可以通过调用 git 二进制文件在任何语言中实现。 - iBug
@iBug,git symbolic-ref HEAD 可以帮助你,并且只需使用 grep 命令指示致命错误即可。 - Masoud

2

从git 2.22版本开始,您也可以使用以下方式:

git branch --show-current

当不在分支上时,这将不会打印任何内容。


1
使用 git branch 命令查找分离的 HEAD...
$ git branch -q
* (HEAD detached at c61a6d2)
  master

你确定这个输出已经可以被使用了吗?(例如文本解析) - iBug
肯定可以在我的git包装器中使用。 Git能改变输出吗?是的,但是对位腐败的易感性是您编写的任何代码都普遍存在的。如果您担心,可以编写一个单元测试... - Mike Pennington

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