Git-Tag-Liste, Commit-Sha1-Hashes anzeigen

101

Der git tagBefehl listet also die aktuellen Git-Tags auf

tag1
tag2

git tag -n druckt die Nachricht des Tags

tag1  blah blah
tag2  blah blah

Was ist der beste Weg, um den Hash von tag1 & tag2 zu erhalten?

Quang Van
quelle
1
Keine Frage, die ich separat stellen möchte, aber ich frage mich, warum git tag( -noder eine andere Option ...) überhaupt keine Commit-Hashes angezeigt werden. Es ist schön zu sehen, welche Lösungen die Leute finden, aber ich halte dies für einen Konstruktionsfehler bei den verfügbaren Optionen.
andreee

Antworten:

142

Um Git-Tags mit dem SHA1-Hash des Tag-Objekts abzurufen, können Sie Folgendes ausführen:

git show-ref --tags

Die Ausgabe sieht dann ungefähr so ​​aus:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Jede Zeile ist der SHA1-Hash des Tags, gefolgt vom Tag-Namen mit dem Präfix refs/tags/.

Wenn Sie den SHA1-Hash des Commits anstelle des Tag-Objekts verwenden möchten, können Sie Folgendes ausführen:

git show-ref --tags -d

Dies erzeugt eine Ausgabe wie:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

Die Zeilen, die mit ^{}beginnen, beginnen mit dem SHA1-Hash des tatsächlichen Commits, auf das das Tag zeigt.

peterjmag
quelle
7
Beachten Sie, dass hierdurch nicht zwischen leichten und mit Anmerkungen versehenen Tags unterschieden wird. Bei Lightweight-Tags wird das Commit und bei kommentierten Tags der Hash des Tag-Objekts selbst angezeigt.
Lily Ballard
20
Um eine Liste von Tags mit dereferenzierten Verweisen anzuzeigen (bei kommentierten Tags), verwenden Sie git show-ref --tags -d. Dereferenzierte Tags werden mit a nachfixiert ^{}.
S. Christoffer Eliesen
49

Der git tagBefehl ist unterentwickelt. Es ist viel erwünscht, aber es fehlt darin, wie vollständige Tag-Details und Tags in der Reihenfolge des Commit-Verlaufs.

Ich mag das stattdessen, was genau das gibt, was ich will, aber nicht bekommen kann von git tag:

git log --oneline --decorate --tags --no-walk

Dies gibt eine sehr schöne farbcodierte Ansicht der Tags in umgekehrter chronologischer Reihenfolge (wie im vollständigen Protokoll). Auf diese Weise sehen Sie nicht nur die Tags, sondern auch die abgekürzten Hashes und die Commit-Nachrichten der Tag-Commits.


Ich habe es auf git tund git tagswie folgt ausgerichtet:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Hinweis: Ich musste die Bash-Umleitung verwenden, git tda Git das Aufrufen eines Alias ​​von einem anderen Alias ​​nicht unterstützt (was ein Mist ist).


Wenn Sie das Datum und die Uhrzeit des Commits anzeigen möchten, versuchen Sie Folgendes:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

Sie können andere Datumsformate in der --dateOption verwenden sowie die Ausgabe vollständig steuern, um Ihrem individuellen Geschmack in der --prettyOption zu entsprechen. Beide Optionen sind in der Git-Log-Dokumentation gut dokumentiert .

ADTC
quelle
2
Obwohl dies nicht das ist, was das OP verlangt hat (Commit- Sha1-Hashes anzeigen ), ist es sehr nützlich, da die Commit-Nachrichten auch nützlich sein können. +1 von mir.
Stelios Adamantidis
2
@nealmcb git logist mächtig! Sie können genau das anzeigen lassen, was Sie möchten. Versuchen Sie es git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Andere Datumsformate sind ebenfalls möglich. Schauen Sie einfach auf --dateder Hilfeseite nach. Ich habe meine Antwort aktualisiert, um diese Option einzuschließen.
ADTC
1
@SteliosAdamantidis Eigentlich gibt meine Antwort die abgekürzten SHA1-Hashes (die ersten 7 Zeichen) an, und wenn Sie Hashes in voller Länge möchten, können Sie sie jederzeit mit --prettyund ändern %H. Vielen Dank für die +1 :)
ADTC
15

Kommentierte Tags haben ihre eigene SHA-1, daher müssen wir sie dereferenzieren. Lightweight-Tags können jedoch nicht dereferenziert werden, da sie bereits auf ein Commit verweisen. Um zu lösen, müssen wir beide auflisten und die Commit-Objekte filtern:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Ergebnis mit leichten Tags:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Ergebnis mit kommentierten Tags:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}
Steven Penny
quelle
Bei Verwendung git log --tags --oneline --no-walkwerden auch kommentierte Tags automatisch berücksichtigt. :)
ADTC
11

Um den SHA1 zu erhalten, auf den sich eine beliebige Art von Referenz (Zweig, Tag ...) bezieht, verwenden Sie git rev-parse:

git rev-parse tag1^0 tag2^0

Es werden nur die vollständigen SHA1s in separaten Zeilen gedruckt. Das ^0Suffix ist eine spezielle Syntax, um sicherzustellen, dass der SHA1 des Commits gedruckt wird, auf das das Tag zeigt, unabhängig davon, ob es mit Anmerkungen versehen ist oder nicht. (Mit Anmerkungen versehene Tags sind eigenständige Objekte, die zusammen mit Metadaten einen Zeiger auf ein Commit enthalten. Wenn Sie wissen, dass ein Tag mit Anmerkungen versehen ist und die SHA1 des Tags möchten, lassen Sie einfach das ^0.)

Natürlich sollten Sie dies nicht oft tun müssen, da jeder Git-Befehl, der einen SHA1 akzeptiert, auch ein Tag akzeptieren sollte!

Cascabel
quelle
Beste Antwort hier, danke @Jefromi. Beachten Sie, dass in einer Windows-Cmd-Shell jeder git-Befehl mit ^ in Anführungszeichen gesetzt werden muss: z. B. git rev-parse "tag1 ^ 0" "tag2 ^ 0".
Jojo
8

Ich hatte eine ähnliche Frage, wollte aber den Hash von (mehreren) spezifischen Tags. Ich habe festgestellt, dass "show-ref" eine Liste von Tags enthält, also erledigt dies den Job:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Einige Experimente mit "git show" führten jedoch zu folgendem Befehl:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

Da ich mit "show" viel besser vertraut bin als mit "show-ref", finde ich letzteres leichter zu merken und auch hilfreicher.

Siehe auch die schöne Zusammenfassung in Wie erkennt man, auf welches Commit ein Tag in Git verweist? .

Ted
quelle
3

Die Tags müssen signiert und / oder mit Nachrichten versehen sein. Leichte Tags haben keine SHA1-Objekte und sind nur Refs. Andernfalls versuchen Sie es git show.

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

Dies gibt eine Liste aller Commits für Tags. Kommentierte Tags werden dereferenziert. Senden Sie hier Danke .

anatoly techtonik
quelle
Tolle Lösung. Wenn Sie nur Seitennamen anstelle des vollständigen Referenznamens haben möchten, können Sie die Verwendung %(refname:short)anstelle von ändern %(refname).
Radon8472
2

Ich nahm den Befehl von anatoly techtonik post und fügte die Überschriftenmeldung der Tags / Commits hinzu und formulierte sie als nette Spalten.

Das Ergebnis ist eine Ausgabe, git tag -ndie mit dem Commit-Hash als Präfix identisch ist.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Wenn Sie den Long-Hash anstelle des Short-Hash haben möchten, ersetzen Sie ihn einfach objectname:shortdurch objectname.

Radon8472
quelle