Jak znaleźć tag powiązany z danym zatwierdzeniem git?

90

W przypadku wydań zwykle oznaczam coś w rodzaju v1.1.0. Podczas tworzenia skryptu tworzę plik fwVersion.c, który zawiera aktualne informacje git. Obecnie mam w pliku informacje o zmianach i gałęziach, ale chciałbym dodać znacznik.

czy to możliwe?

wes
źródło

Odpowiedzi:

115

Sprawdź w dokumentacji git describe. Znajduje najbliższy znacznik do danego zatwierdzenia (jest to znacznik wskazujący na przodka zatwierdzenia) i opisuje to zatwierdzenie za pomocą znacznika.

Jeśli chcesz tylko wiedzieć, czy zatwierdzenie jest wskazywane przez tag, możesz sprawdzić wynik:

git describe --exact-match <commit-id>
CB Bailey
źródło
32
git describe --tags <commit-id>dla tagów bez adnotacji
Aleksandr Levchuk
1
Uwielbiam to. Szczególnie podoba mi się to, że mogę uzyskać czytelny dla człowieka git describe --all --exact-match `git rev-parse HEAD`
tekst
5
W nowszych wersjach git describe --tags --abbrev=0 REVprzyda się, gdy nie chcesz mieć śmieci na tagu.
Craig Ringer
1
git describe --all(dla aktualnie sprawdzonego zatwierdzenia) lub git describe --all <commit>zawsze robiłem wszystko, czego kiedykolwiek chciałem.
rfay
Najlepszą częścią korzystania z wersji z git jest zaprzestanie kodowania wersji w źródle podczas wdrażania oprogramowania. Sposób znalezienia najbliższego tagu w git opis może zostać użyty do obliczenia kolejnego numeru wersji i po prostu dodaj tag ref do repozytorium i nazwę pakietu.
Sid
64

Jeśli chcesz, to pierwszy znacznik zawierający zatwierdzenie, to:

git describe --contains <commit>

daje najlepszą odpowiedź IMO. Jeśli masz częste tagi niż używanie „git tag --contains” na starym zatwierdzeniu w dużym repozytorium, może to zająć trochę czasu, a otrzymasz wszystkie tagi, które zawierają to zatwierdzenie.

Ta forma opisu gita działa bardzo szybko i daje pojedynczą wartość wyjściową, która jest pierwszym znacznikiem zawierającym zatwierdzenie i jak daleko jest wstecz.

Sójka
źródło
27

Co powiesz na to?

git tag --points-at <commit-id>

Daje ci wszystkie tagi, które ma dane zatwierdzenie (podczas gdy git describedaje tylko jeden) i nie zawiera tagów na podrzędnych zatwierdzeniach (tak jak git tag --containsrobi).

Albertas Agejevas
źródło
Podoba mi się to, ponieważ żaden komunikat o błędzie nie jest zapisywany na stderr. Dzięki.
Basuke
23

Możesz znaleźć te informacje w instrukcji

git tag --contains <commit>
dharga
źródło
3
Spowoduje to wyświetlenie wszystkich tagów, które zawierają dane zatwierdzenie (tj. Tagi wskazujące na elementy potomne danego zatwierdzenia), więc niekoniecznie da pojedynczy tag dla danego zatwierdzenia lub jakiekolwiek informacje o tym, który tag jest najbliższy, chyba że lista zawiera tylko jedno zatwierdzenie.
CB Bailey,
4
Jak powiedział powyżej Charles Bailey, nie do końca tego szukam. Może powinieneś RTFM :)
wes
1
Przepraszam za złą odpowiedź. Kiedy sprawdziłem, wydawało się, że robi to, o co prosiłeś. Zrobiłem RTFM, właśnie rozwiązałem zły problem. Mam nadzieję, że Bailey zaoferował rozwiązanie, które Ci pomoże.
dharga
6
nie powinieneś czytać całego podręcznika gita, zanim zadasz pytanie git na SO, prawda? google indeksuje tak dużo lepiej niż jakakolwiek strona
podręcznika
13

Znalazłem kombinację obu najlepszych odpowiedzi, aby dać mi to, czego chciałem:

git describe --tags --exact-match <commit-id>

To daje ci tag, który jest TYLKO dla tego zatwierdzenia i dla tych bez adnotacji. Przydatne, gdy chcesz znaleźć tagi i nie martwić się wtedy o usunięcie formatowania (na przykład dla Jenkinsa).

na przykład. $ git describe --tags --exact-match head~2

Daje Ci:

$ ReleaseBeta
Christophera Aleksandra
źródło
0

Konsolidacja niektórych odpowiedzi:

git tag --contains [<ref>]

i

git tag --points-at [<ref>]

Lub tylko

git tag

zachowują się tak samo, wypisując wszystkie (i wszystkie) znaczniki dla określonego ref lub bieżącego zatwierdzenia, jeśli nie zostały określone.

git describe --tags [<ref>]

gdzie <ref>domyślnie jest to aktualne zatwierdzenie, kończy z 128, jeśli żadne znaczniki nie są skojarzone z zatwierdzeniem, i drukuje znacznik powiązany z zatwierdzeniem (wydaje się, że nie ma wzoru).

git describe [<ref>] zachowuje się tak samo jak with, --tagsz tą różnicą, że drukuje tylko etykiety z adnotacjami.

Podanie opcji --containsto describespowoduje wydrukowanie znacznika a, który jest powiązany z przodkiem określonego zatwierdzenia. Na przykład

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

bschlueter
źródło