547 Stimmen

Wie kann man feststellen, auf welchen Commit ein Tag in Git verweist?

Ich habe einen Haufen unkommentierter Tags im Repository und möchte herausfinden, auf welchen Commit sie verweisen. Gibt es einen Befehl, der einfach die Tags und ihre Commit-SHAs auflistet? Das Auschecken der Tags und das Betrachten des HEADs erscheint mir etwas zu mühsam.

Update

Nachdem ich die Antworten durchgesehen hatte, wurde mir klar, dass ich eigentlich nur die Vorgeschichte der Markierung betrachten wollte, für die git log <tagname> ist ausreichend.

Die Antwort, die als Antwort markiert ist, ist nützlich, um eine Liste von Tags und deren Übertragungen zu erhalten, was meine Frage war. Mit ein bisschen Shell-Hackery bin ich sicher, dass es möglich ist, diese in SHA+Commit Nachricht umzuwandeln.

2voto

Louis Punkte 339

So erhalten Sie den aktuellen SHA1-Hash

Abgekürzter Commit-Hash

git show <tag> --format="%h" --> 42e646e

Commit Hash

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

2voto

Avy Sharell Punkte 21

Wenn Sie die Details des Tags SOMETAG (Tagger, Datum usw.), den Hash des Commits, auf den er verweist, und ein paar Informationen über den Commit sehen möchten, aber nicht den vollständigen Diff, versuchen Sie

git show --name-status SOMETAG

Beispielhafte Ausgabe:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0voto

sibaz Punkte 1132

Ich habe also eine Reihe von Release-Ordnern, wobei diese Ordner aus einem von mehreren verschiedenen Repos ausgecheckt sein können und Dev-, Qa- oder Master-Zweige sein können oder Produktions-Releases, die aus einem Tag ausgecheckt sind, und das Tag kann mit Anmerkungen versehen sein oder nicht. Ich habe ein Skript, das sich den Zielordner ansieht und eine Antwort in der Form - zurückgibt. Das Problem ist, dass verschiedene Versionen von Git unterschiedliche Status' für ein Tag-Checkout zurückgeben.

Ich fand also git show-ref --tags funktionierte zunächst, außer bei den kommentierten Tags. Das Hinzufügen von -d fügte der Liste der Tags jedoch einen separaten Eintrag hinzu, einen für den Tag, den anderen für die Anmerkung (die Annotation Commit wurde als ^{} identifiziert, was ich mit sed entfernt habe).

Dies ist also der Kern meines Skripts, für jeden, der es haben möchte:-

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0voto

Kann unten verwendet werden, es wird den Commit-Hash geben
git show -s --format=%H <tag>^{commit}

Wenn abgekürzter Commit-Hash erforderlich, git show -s --format=%h <tag>^{commit}

0voto

CervEd Punkte 1487

Hackige Lösung

Parsen Sie die .git/packed-refs und formatieren Sie es als {tag}\t{sha}

sed -n '/ refs\/tags/ { s@\([^ ]*\) refs/tags/\(.*\)@\2\t\1@; p}' .git/packed-refs

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X