これまでのところ:
git rev-parse <tagname> | xargs git cat-file -p
しかし、これは解析するのが最も簡単なことではありません。git-log
必要な情報だけを取得できるように、の--pretty
オプションに似たものを期待していました。
何か案は?
同じ情報を取得するより直接的な方法は次のとおりです。
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
git show $TAG
タグの情報と、それが指しているコミットが表示されます。
すでに機能しているが、入力するのが面倒な場合は、いつでもエイリアスを設定できます。
[alias]
showtag = !sh -c 'git rev-parse $1 | xargs git cat-file -p' -
そしてそれを呼び出す:
$ git showtag my-tag-name
これはかなり前にすでに回答されていますが、最良の解決策ではなくなったにもかかわらず、依然として検索結果のトップです。
指示:
git for-each-ref refs/tags/$TAG --shell --format='
TAG=%(refname)
TYPE=%(objecttype)
COMMIT=%(objectname)
TAGGER=%(tagger)
EMAIL=%(taggeremail)
DATE=%(taggerdate)
CONTENTS=%(contents)
'
--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'
TYPE='tag'
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.
'