Hier ist eine kurze Shell-Skript (in Bash getestet, nicht bestätigt, wenn es auf Asche, etc. funktioniert). Es wird die Variable git_tag
auf den Namen des aktuell ausgecheckten Tags gesetzt, oder lassen Sie es leer, wenn der Checkout nicht markiert ist.
git_tag=''
this_commit=`git log --pretty=format:%H%n HEAD^..`
for tag in `git tag -l`; do
tag_commit=`git log --pretty=format:%H%n tags/$tag^..tags/$tag`
if [ "$this_commit" = "$tag_commit" ]; then
# This is a tagged commit, so use the tag.
git_tag="$tag"
fi
done
Kommentar von Jakub Narębski:
Diese Lösung reduziert die über alle Tags zu Looping, und prüfen, ob sie zu corrent COMMIT-Punkt, das heißt Objekt von HEAD spitz. Mit Sanitär-Befehle, das heißt Befehle für das Scripting gemeint, kann dies geschrieben werden als:
this_commit=$(git rev-parse --verify HEAD)
git for-each-ref --format="%(*objectname) %(refname:short)" refs/tags/ |
while read tagged_object tagname
do
if test "$this_commit" = "$tagged_object"
then
echo $tagname
fi
done
Dieses Alle Tags drucken würde, die den aktuellen begehen zeigen.
Werfen Sie einen Blick auf GIT-VERSION-GEN-Skript realisiert werden (und deren Verwendung in Makefile) in Git-Repository: http://git.kernel.org/?p=git/git.git;a=blob;f=GIT-VERSION-GEN;hb=HEAD –
@jhs: Ich habe Greg Hewgill Antwort hochgestuft . Ich habe die Antwort basierend auf 'git name-rev' herabgestuft, weil sie z.B. 'some-tag ~ 5' und Antwort basierend auf der Kombination von 'git log' und' git tag -l', weil es hässlich und ineffizient ist. –