So listen Sie alle Tags auf, die auf ein bestimmtes Commit in git verweisen


81

Ich habe die Befehle gesehen git describeund git-name-reves ist mir nicht gelungen, sie dazu zu bringen, mehr als ein Tag aufzulisten.

Beispiel: Ich habe den sha1 48eb354 und weiß, dass die Tags A und B darauf verweisen. Ich möchte also einen git-Befehl git {something} 48eb354, der eine Ausgabe ähnlich "A, B" erzeugt. Ich bin nicht daran interessiert, Referenzen relativ zu anderen Tags oder Zweigen zu kennen, nur genaue Übereinstimmungen für Tags.

Antworten:


45

git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'

sollte sowohl für leichte als auch für kommentierte Tags funktionieren.


Vielen Dank. Genau das, was ich will.
Mrutyunjay

Dies funktioniert gut für Git <1.7.10. Können Sie erklären, was dieser zweite Teil des sed-Ausdrucks bewirkt? -e 's/\^{}//'
Dave

Ah, egal, ich habe es herausgefunden. Es ist für die -dOption auf git show-ref. In den Dokumenten werden "-d, --dereference Dereference-Tags auch in Objekt-IDs eingefügt. Sie werden mit" ^ {} "als Anhang angezeigt."
Dave

1
Leichte Verbesserung / Verallgemeinerung für die Verwendung beliebiger ${ref}, einschließlich kommentierter Tags:hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
Christian Goetze


50

Sie können verwenden:

git tag --contains <commit>

Das zeigt alle Tags bei bestimmten Commit. Es kann verwendet werden anstelle von:

git tag --points-at HEAD

das ist nur ab 1.7.10 verfügbar.


10
NB: 'git tag --contains' zeigt nicht nur die Tags an, die auf das Commit verweisen, sondern enthält auch alle späteren Tags, von denen aus es erreichbar ist.
Staafl

Zumindest in Version 2.6.4 gibt dies nur ein einzelnes Tag zurück, das auf das angegebene Commit verweist. Es gibt nicht alle zurück. Die obige Antwort von @max scheint für mehrere Tags richtig zu funktionieren.
Dejay Clayton

--containserscheint auch viel langsamer als --points-at(7-8s Ausführungszeit vs <1s)
SSilk

4
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
  grep ^$commit_id |
    cut -d' ' -f2

Schade, dass es nicht einfacher geht. Ein weiteres Flag git tagfür Commit-IDs könnte diesen git for-each-refAufruf auf natürliche Weise ausdrücken .


1
Vielen Dank für die Info, aber ich scheine die Tags mit diesem Befehl auch nicht sehen zu können. Die Verwendung des einfacheren "git for-each-ref | grep 48eb354" ergibt 0 Übereinstimmungen. gitk hingegen listet die 2 Tags vor diesem Commit gut auf.
Zitrax

1

Der folgende Befehl erledigt den Job, analysiert jedoch direkt den Inhalt des .git-Verzeichnisses und kann daher unterbrochen werden, wenn sich das Format des Git-Repositorys ändert.

grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'

Listet sie auch nicht auf, der einzige Ort, an dem ich sha1 sehe, wenn ich den gesamten .git-Ordner greife, ist in gitk.cache und protokolliert / refs / remotes / origin / master. Wie kommt es, dass Gitk sie auflisten kann? Ich stelle auch fest, dass die Tags, die ich betrachte, mit Anmerkungen versehene Tags sind. Dies könnte der Grund sein, warum die beiden aktuellen Antworten für mich nicht funktionieren.
Zitrax

1

Für das aktuelle Commit können Sie verwenden

git tag --points-at $(git log -n1 --pretty='%H')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.