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.

Zitrax
quelle

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.

max
quelle
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.

Yorammi
quelle
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 .

Aristoteles Pagaltzis
quelle
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,.*/,,'
Sylvain Defresne
quelle
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')
Progman
quelle