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?

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>

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.


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).


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>

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.