我想在我指定的提交中找到最接近标记的名称。 git describe x
效果很好。但这会返回我想要摆脱的扩展格式。 我想要实际的标签名称。
例如。 Release/v2.0.0.11-12-g17d232a
我正在编写在破折号上分割的各种解析规则,但不能保证标记名也不能有破折号。如果标签在提交中,则额外的元数据不会显示。
那么有一些隐藏的git voodoo给我标记名吗?
答案 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`将始终显示额外的元数据。然后可以使用正则表达式来关闭结束位。