2

在脚本中,我想确定是否签出了标签或分支。

目前,我有:

git describe --tags

它将显示标签名称,但如果我们在分支上,它将引发错误(返回状态!= 0):

fatal: No names found, cannot describe anything.

我可以依靠这种行为还是有更好/更官方的方式来做到这一点?

是否有一些我应该知道的没有被这种方法捕获的案例?

4

4 回答 4

7

您可以使用它git symbolic-ref HEAD来检查您是否在分支上并获取其名称:

> git checkout master
[....]
> git symbolic-ref HEAD
refs/heads/master
> echo $?
0

如果您已签出标签,您将收到错误消息:

> git checkout some_tag
[....]
> git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref
> echo $?
128
于 2013-05-30T14:36:53.900 回答
1

(编辑)比我之前的更好:

if read what where huh; test "$what" = ref:
then echo On branch ${where#refs/heads/}
else echo "not on any branch; last checkout was:"
     git reflog|sed '/checkout:/!d;q'
fi < "`git rev-parse --git-dir`"/HEAD

将告诉您上次结帐的来源。

git log HEAD^! --oneline --decorate

将告诉您当前提交的所有符号名称。

于 2013-05-30T14:51:34.507 回答
0

git status(或git branch)知道你在哪个分支。注意:你总是在一个分支上:默认分支是master

使用git tag可以知道当前分支的标签列表。

于 2013-05-30T12:51:36.970 回答
0

好吧,经过一些测试,结果证明它git describe --tags不是很可靠(在一种情况下,我检查了一个分支,它确实返回了一些东西)。

我最终使用:

git branch | grep '^*'

这将返回选定的分支。如果我签出一个标签,这将返回:

* (no branch)

在我的脚本中,我解析字符串以检查它是否包含(no branch).

于 2013-05-30T14:17:19.230 回答