wake-up-neo.com

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

Ich habe ein paar nicht notierte Tags im Repository und möchte herausfinden, auf welche Commit sie verweisen. Gibt es einen Befehl, der nur die Tags und die zugehörigen SHAs auflistet? Das Auschecken des Tags und das Betrachten des HEAD erscheint mir etwas zu mühsam.

Aktualisieren

Nachdem ich die Antworten durchgegangen war, wurde mir klar, dass ich eigentlich nur die Geschichte betrachten wollte, die zum Tag führte, für das git log <tagname> ausreicht. 

Die Antwort, die als Antwort markiert ist, ist hilfreich, um eine Liste der Tags und ihrer Commits zu erhalten. Mit etwas Shell-Hacker ist es sicher möglich, diese in SHA + Commit-Nachricht umzuwandeln.

340
Igor Zevaka

Eine Möglichkeit, dies zu tun, wäre mit git rev-list. Das Folgende gibt das Commit aus, auf das ein Tag zeigt:

$ git rev-list -n 1 $TAG

Sie könnten es als Alias ​​in ~/.gitconfig hinzufügen, wenn Sie es häufig verwenden:

[alias]
  tagcommit = rev-list -n 1

Und dann rufen Sie es an mit:

$ git tagcommit $TAG
272
mipadi
git show-ref --tags

Zum Beispiel zeigt git show-ref --abbrev=7 --tags etwas wie das Folgende:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
206
CB Bailey

Verwenden Sie einfach git show <tag>

Es gibt jedoch auch Dumps ab. Verwenden Sie git log -1 <tag>, um diese Unterschiede wegzulassen. (Danke an @DolphinDream und @demisx!)

89
Hlung

In meinem Repository zeigt git show-ref TAG den Hash des Tags, nicht den Hash des Commits, auf den er verweist.

git show-ref --dereference TAG zeigt zusätzlich das Commit, auf das gezeigt wird.

33
orip

Benutzen

git rev-parse --verify <tag>^{commit}

(Dies würde SHA-1 eines Commits auch für das kommentierte Tag zurückgeben).


git show-ref <tag> würde auch funktionieren, wenn <tag> nicht kommentiert wird. Und es gibt immer git for-each-ref (siehe Dokumentation für Details).

32
Jakub Narębski

Von Igor Zevaka :

Zusammenfassung

Da es ungefähr vier annähernd gleichermaßen akzeptable, aber unterschiedliche Antworten gibt, werde ich die verschiedenen Möglichkeiten eines Skin-Tags zusammenfassen.

  1. git rev-list -1 $TAG ( antwort ). git rev-list gibt die Commits aus, die zum $TAG ähnlich wie git log führen, aber nur die SHA1 des Commits zeigen. Der -1 beschränkt die Ausgabe auf das Commit, auf das er zeigt.

  2. git show-ref --tags ( answer ) zeigt alle Tags (lokal und aus der Ferne abgerufen) und ihre SHA1 an.

  3. git show-ref $TAG ( answer ) zeigt das Tag und seinen Pfad zusammen mit dem SHA1 an.

  4. git rev-parse $TAG ( answer ) zeigt den SHA1 eines nicht notierten Tags.

  5. git rev-parse --verify $TAG^{commit} ( answer ) zeigt eine SHA1 von kommentierten und nicht notierten Tags. Unter Windows verwenden Sie git rev-parse --verify %TAG%^^^^{commit} (vier Hüte).

  6. cat .git/refs/tags/* oder cat .git/packed-refs ( answer ), abhängig davon, ob das Tag lokal ist oder nicht.

32
user456814

Wie wäre es damit:

git log -1 $TAGNAME

ODER 

git log -1 Origin/$TAGNAME
15
Tuong Le

Um den sha/hash des Commits zu erhalten, auf das sich ein Tag bezieht (nicht das sha des Tags):

git rev-list -1 <tag>

10
Daniel Little

Ich würde auch gerne den "richtigen" Weg wissen, aber in der Zwischenzeit können Sie dies tun:

git show mytag | head -1    
7
gahooa

Obwohl dies ziemlich alt ist, dachte ich, ich würde auf ein cooles Feature hinweisen, das ich gerade für das Auflisten von Tags mit Commits gefunden habe:

git log --decorate=full

Es werden die Zweige angezeigt, die mit einem Commit enden/beginnen, und die Tags für Commits.

5
Terrence Reilly

Sie könnten auch ein besser verständliches Bild davon erhalten, wo Tags auf die Verwendung hindeuten

git log --graph |git name-rev --stdin --tags |less

und scrollen Sie dann mit / zu dem Tag, den Sie suchen.

Eine kompaktere Ansicht (--pretty=oneline) plus alle Köpfe (-a) könnte ebenfalls helfen:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Sieht ein wenig beängstigend aus, könnte aber bei Bedarf auch in ~/.gitconfig verfälscht sein.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
4

Dadurch erhalten Sie den aktuellen SHA1-Hash 

Abkürzter Commit Hash

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

Commit Hash 

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

ich möchte auch den richtigen Weg wissen, aber Sie können immer einen Blick auf Folgendes werfen:

$ cat .git/packed-refs 

oder:

$ cat .git/refs/tags/*
2
miku

Wenn Sie die Details des Tags SOMETAG (Tagger, Date usw.) sehen möchten, den Hash des Commits, auf den er zeigt, und ein paar Informationen zum Commit, jedoch ohne den vollständigen Unterschied, versuchen Sie es

git show --name-status SOMETAG

Beispielausgabe:

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) .....
2
Avy Sharell

Von git Mailingliste erhalten Sie die Liste der Commit-Hashes für Tags mit automatischer Dereferenzierung für kommentierte Tags:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
1

Dies zeigt nicht die Dateinamen an, aber zumindest bekommt man ein Gefühl für das Repository.

cat .git/refs/tags/*

Jede Datei in diesem Verzeichnis enthält ein Commit SHA, das auf ein Commit verweist.

1
Peter Stuifzand

Ich habe also eine Menge von Release-Ordnern, in denen diese Ordner aus einem von einigen verschiedenen Repos ausgecheckt werden können. Sie können dev-, qa- oder master-Zweige sein oder Produktionsversionen sein, die von einem Tag ausgecheckt werden, und der Tag kann sein kommentiert oder nicht. Ich habe ein Skript, das den Zielordner betrachtet und eine Antwort in der Form zurückbekommt -. Das Problem ist, dass verschiedene Versionen von git einen anderen Status für eine Tag-Überprüfung zurückgeben. 

Also fand ich git show-ref --tags anfangs abgesehen von den kommentierten Tags. Durch Hinzufügen von -d wurde der Liste der Tags jedoch ein separater Eintrag hinzugefügt, einer für den Tag und der andere für die Annotation (das Annotation-Commit wurde als ^ {} identifiziert, das ich mit sed entfernt habe). 

Dies ist also der Kern meines Skripts für jeden, der es will: -

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
0
sibaz

Kann unten verwenden, es wird der Festschreibungshash geben
git show -s --format=%H <tag>^{commit}

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