如何从git标签中读取标记器信息?

时间:2010-11-15 15:29:12

标签: git git-tag

到目前为止,我有:

git rev-parse <tagname> | xargs git cat-file -p

但这不是解析最容易的事情。我希望有类似于git-log的{​​{1}}选项,所以我可以抓住我需要的信息。

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:29)

获得相同信息的更直接方式是:

git cat-file tag <tagname>

这使用单个命令并避免管道。

我在bash脚本中使用了这个,如下所示:

if git rev-parse $TAG^{tag} -- &>/dev/null
then
    # Annotated tag
    COMMIT=$(git rev-parse $TAG^{commit})
    TAGGER=($(git cat-file tag $TAG | grep '^tagger'))
    N=${#TAGGER} # Number of fields
    DATE=${TAGGER[@]:$N-2:2} # Last two fields
    AUTHOR=${TAGGER[@]:1:$N-3} # Everything but the first and last two
    MESSAGE=$(git cat-file tag $TAG | tail -n+6)
elif git rev-parse refs/tags/$TAG -- &>/dev/null
then
    # Lightweight tag - just a commit, basically
    COMMIT=$(git rev-parse $TAG^{commit})
else
    echo "$TAG: not a tag" >&2
fi

答案 1 :(得分:22)

git show $TAG将显示标记的信息以及它指向的提交。

如果你有一些已经适合你的东西,但输入不方便,你可以随时设置一个别名:

[alias]
        showtag = !sh -c 'git rev-parse $1 | xargs git cat-file -p' -

并将其命名为:

$ git showtag my-tag-name

答案 2 :(得分:8)

这已经很久以前就已经得到了解答,但仍然是最热门的搜索结果,即使它不再是最好的解决方案,所以在这里:

<强>命令:

git for-each-ref refs/tags/$TAG --shell --format='
TAG=%(refname)
COMMIT=%(objectname)
TAGGER=%(tagger)
EMAIL=%(taggeremail)
DATE=%(taggerdate)
CONTENTS=%(contents)
'

- shell 执行Shell脚本的引用。还有 - perl - python - tcl 。 如果您不想将整个格式写为命令行选项,您也可以将其放在 file.txt 中并执行此操作:

git for-each-ref refs/tags/<tag> --shell --format="$(cat file.txt)"

<强>输出:

TAG='refs/tags/4.1.0-RC1'
COMMIT='973cc103f942330550866588177fe53ea5765970'
TAGGER='ml_'
EMAIL='<ml@example.org>'
DATE='Fri Sep 16 14:14:50 2016 +0200'
CONTENTS='Release 3:
* INSTALL.md added.
* GIT.md modified.
'

更多信息: https://git-scm.com/docs/git-for-each-ref