获取最近的git Tag的确切标记名称

时间:2016-06-30 20:01:21

标签: git

我想在我指定的提交中找到最接近标记的名称。 git describe x效果很好。但这会返回我想要摆脱的扩展格式。 我想要实际的标签名称。

例如。 Release/v2.0.0.11-12-g17d232a

我正在编写在破折号上分割的各种解析规则,但不能保证标记名也不能有破折号。如果标签在提交中,则额外的元数据不会显示。

那么有一些隐藏的git voodoo给我标记名吗?

2 个答案:

答案 0 :(得分:0)

没有这样的旗帜。但是,您可以使用git rev-parse来确定输出实际上是标记,还是带有修饰符的标记:

$ git describe
v2.9.0-137-gcf4c2cf
$ git rev-parse --symbolic-full-name v2.9.0-137-gcf4c2cf
$ git checkout v2.9.0
Note: checking out 'v2.9.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 05219a1... Git 2.9
$ git describe
v2.9.0
$ git rev-parse --symbolic-full-name v2.9.0
refs/tags/v2.9.0

因此,如果git rev-parse --symbolic-full-name发出符号全名,那么您所拥有的实际上就是一个标记。如果没有,您必须拥有其中一个令人讨厌的git describe伪标签。

(注意git rev-parse,因此每个需要修订的Git命令都会将伪标记变为提交ID。)

修改:使用expr的示例shell脚本:

#! /bin/sh
# strip "git describe" output of "-<digits>-g<abbrevhash>" iff
# such a suffix seems to be present
case $# in 0) usage;; esac # define usage() yourself
for arg do
    if [ -n "$(git rev-parse --symbolic-full-name "$arg")" ]; then
        printf '%s\n' "$arg"
    else
        expr "$arg" : '\(.*\)-[0-9]*-g[0-9a-f]*$'
    fi
done

(非常轻微的测试)

答案 1 :(得分:0)

&#39; git describe --long`将始终显示额外的元数据。然后可以使用正则表达式来关闭结束位。