2010-02-24 9 views
30

Ich habe ein Repository, das mehrere Tags auf dem gleichen Commit hat. Zum Beispiel:Wie bekomme ich Tags beim aktuellen Commit?

commit #3 <--- TAG1/TAG2/TAG3 

    | 

commit #2 <--- TAG4/ TAG5 

    | 

commit #1 <--- TAG6/ TAG7 

Ich möchte herausfinden, welche Tags auf einem bestimmten Commit sind. wenn ich begehen Zum Beispiel überprüfen 1, würde Ich mag Tag erhalten 6 und Tag 7.

ich versucht habe:

git checkout <commit 1> 
git tag --contains 

die Tags 1-7 angezeigt.

git checkout <commit 1> 
git describe --tags HEAD 

nur Tag 6 angezeigt.

Was ist der richtige Weg, dies in Git zu tun?

Antwort

3

Das ist nicht ideal, aber vielleicht hilfreich:

 
$ git log -n 1 --decorate --pretty=oneline 

Sie mit dem Format spielen, um könnten genau das bekommen, was Sie wollen.

+0

Danke für Ihre Informationen, mein Repo hat mehr als 300 verschiedene Gits. Drücken Sie "Q" für 300 Mal wirklich schwer für mich. – Shawn

+0

@Shawn Es gibt keine Notwendigkeit, Q zu drücken ... –

+0

Immer wenn ich git log benutze, um irgendetwas anzuzeigen, muss ich die Taste q drücken, um den Log-Anzeigemodus zu verlassen. Nicht sicher, ob Sie mit dem gleichen konfrontiert – Shawn

17

Einige Verbesserungen auf William Antwort:

git config --global alias.tags 'log -n1 --pretty=format:%h%d' 

Die Ausgabe sieht wie folgt aus:

~$ git tags 
7e5eb8f (HEAD, origin/next, origin/master, origin/HEAD, master) 
~$ git tags HEAD~6 
e923eae (tag: v1.7.0) 
+1

Dies ist ein cooler Tipp – cmcginty

+0

Ich versuche, sed/tr/grep Befehle hinzufügen, um diese Ausgabe in eine einfache Liste ohne Interpunktion zu konvertieren. Ich kann einen solchen "git log" -Befehl direkt erstellen, aber das Entweichen bringt mich um, wenn ich ihn in einen Git-Konfigurationsalias lege. Hier ist mein Log-Befehl: git log -n1 --pretty = "format:% d" | sed "s /,/\ n/g" | grep tag | sed "s/tag: \ |) // g" –

+0

Ich habe dies verfeinert, um es für automatisierte Skripte nützlicher zu machen (z. B. das Setzen der Tags in Ihre Eingabeaufforderung), in einer Antwort unten ... –

18

Ich denke, vielleicht git einige Optionen hinzugefügt hatte, da diese Frage gestellt wurde, aber es immer noch da kommt in ziemlich hoch auf google, ich dachte, ich würde hinzufügen, dass auf diese Weise gut funktioniert:

Oder ersetzen Sie HEAD durch eine beliebige gültige gültige Referenznummer.

Dies wird eine neue Zeile gedruckt getrennte Liste von Tags, wenn die HEAD alle Tags enthält und drucken nichts sonst, so dass Sie bekommen würde:

TAG6 
TAG7 

Und natürlich gibt es viele schöne Wege mit verschiedenen anderen Schale Werkzeuge, die Sie diese Ausgabe formatieren können, sobald Sie es haben ...

+1

Funktioniert perfekt. Warum brauchst du nur "-l"? Aus dem Handbuch scheint, dass "-l" ohne Argumente alle Tags auflistet, was dasselbe wie "tag" ohne Argumente ist. –

+0

@cirosantilli oops, ich denke, ich habe das Handbuch nicht sorgfältig genug gelesen. Obwohl ich denke, dass ich gerne das "-l" hinzufüge, weil es sicherstellt, dass ich kein neues Tag hinzufüge, wenn ich die "--contains" -Flagge vergesse. – arcticmac

+6

Dies gibt die falsche Ausgabe. Es zeigt alle Tags an, die das gegebene Commit "enthalten", d. H. Tags, die auf zuvor erreichbare Commits angewendet wurden, sind ebenfalls enthalten. Die ursprüngliche Frage besagt explizit, dass er diese alten Tags nicht möchte, sondern nur die 'aktuellen' Tags auf dem angegebenen Commit. –

3

Hier ist eine Verfeinerung von @ JoshLee's Antwort, die die Ausgabe manipuliert, um nur Tags (nicht Zweige, HEAD) aufzulisten und das Wort "tag:" und dekorative Interpunktion. Dies ist nützlich, wenn Sie etwas nach oben sind Skripts, das die aktuellen Tags finden müssen (zB sie in Ihrem prompten) setzen:

git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 

Beispiel Ausgabe:

$ git log -n 1 --decorate=short 
commit a9313...c7f2 (HEAD, tag: v1.0.1, tag: uat, mybranch) 
... 
$ git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 
v1.0.1 
uat 
3

Dies zeigt die ID von HEAD begehen, Sowie irgendwelche Zweige oder irgendwelche Tags, die auch genau bei HEAD sind.

git reflog --decorate -1 

Beispielausgabe:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) [email protected]{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD 
55

Zur Vervollständigung (dank Ciro Santili Antwort), git-Tag hat die Option --points-at bekam das genau das tut, was Shawn bittet.

git tag -l --points-at HEAD 

Es ist nicht die Wirkung hat auch die Tags auf vorgebrachten Liste verpflichtet wie Jonathan Hartley in seinem Kommentar des git-tag --contains angegeben.

+0

Dies ist die beste Antwort hier. Keine komplizierte Befehlszeile erforderlich, sondern nur der Tag-Name. –

+0

Genau das, was ich brauchte, danke. –

Verwandte Themen