Jak wyświetlić listę wszystkich tagów wskazujących na konkretne zatwierdzenie w git

85

Widziałem polecenia git describei git-name-revnie udało mi się zmusić ich do wyświetlenia więcej niż jednego znacznika.

Przykład: mam sha1 48eb354 i wiem, że znaczniki A i B wskazują na to. Chcę więc polecenia git, git {something} 48eb354które generuje dane wyjściowe podobne do „A, B”. Nie interesuje mnie znajomość odniesień do innych tagów lub gałęzi, tylko dokładne dopasowania dla tagów.

Zitrax
źródło

Odpowiedzi:

46

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

powinien działać zarówno w przypadku znaczników uproszczonych, jak i oznaczonych.

max
źródło
Dzięki. Dokładnie to, czego chcę.
mrutyunjay,
Działa to dobrze w przypadku git <1.7.10. Czy możesz wyjaśnić, co robi ta druga część wyrażenia sed? -e 's/\^{}//'
Dave
Ach, nieważne, rozgryzłem to. To jest -dopcja włączona git show-ref. Z dokumentów „-d, --dereference” tagi wyłuskiwania również do identyfikatorów obiektów. Zostaną one wyświetlone z dołączonym „^ {}”.
Dave
1
Nieznaczne ulepszenie / uogólnienie w celu użycia dowolnych ${ref}, w tym tagów z adnotacjami:hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
Christian Goetze
50

Możesz użyć:

git tag --contains <commit>

który pokazuje wszystkie tagi w określonym zatwierdzeniu. Może być używany zamiast:

git tag --points-at HEAD

który jest dostępny tylko od 1.7.10.

yorammi
źródło
10
Uwaga: 'git tag --contains' nie pokazuje tylko tagów wskazujących na zatwierdzenie, ale zawiera również wszystkie późniejsze tagi, z których jest osiągalny.
staafl
Przynajmniej w wersji 2.6.4 zwraca to tylko jeden znacznik wskazujący na określone zatwierdzenie. Nie zwraca ich wszystkich. Powyższa odpowiedź @max wydaje się działać poprawnie dla wielu tagów.
Dejay Clayton
--containsrównież pojawia się znacznie wolniej niż --points-at(czas wykonania 7-8s vs <1s)
SSilk
4
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
  grep ^$commit_id |
    cut -d' ' -f2

Szkoda, że ​​nie da się tego łatwiej zrobić. Kolejna flaga git tagwłączająca identyfikatory zatwierdzeń mogłaby git for-each-refnaturalnie wyrazić to wywołanie.

Arystoteles Pagaltzis
źródło
1
Dzięki za informacje, ale wydaje mi się, że nie widzę tagów za pomocą tego polecenia. Użycie prostszego „git for-each-ref | grep 48eb354” daje 0 dopasowań. Z drugiej strony gitk ładnie wymienia 2 znaczniki przed tym zatwierdzeniem.
Zitrax
1

Następujące polecenie wykonuje zadanie, ale bezpośrednio analizuje zawartość katalogu .git i dlatego może się zepsuć, jeśli zmieni się format repozytorium git.

grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'
Sylvain Defresne
źródło
Nie wymienia ich również, jedyne miejsce, w którym widzę sha1 podczas grepowania całego folderu .git, to gitk.cache i logs / refs / remotes / origin / master. Jak to możliwe, że gitk może je wymienić? Zauważyłem również, że tagi, na które patrzę, są tagami z adnotacjami, może to być powodem, dla którego dwie aktualne odpowiedzi nie działają dla mnie.
Zitrax
1

Do bieżącego zatwierdzenia możesz użyć

git tag --points-at $(git log -n1 --pretty='%H')
Progman
źródło