Lista tagów Git, wyświetla skróty sha1 zatwierdzenia

101

więc git tagpolecenie wyświetla bieżące znaczniki git

tag1
tag2

git tag -n wyświetla treść tagu

tag1  blah blah
tag2  blah blah

Jaki jest najlepszy sposób na uzyskanie skrótu tag1 i tag2?

Quang Van
źródło
1
Nie jest to pytanie, które rozważam osobno, ale zastanawiam się, dlaczego git tag( -nlub jakaś inna opcja ...) nie pokazuje skrótów zatwierdzania w pierwszej kolejności. Fajnie jest zobaczyć, jakie rozwiązania wymyślają ludzie, ale uważam to za błąd konstrukcyjny w dostępnych opcjach.
andreee

Odpowiedzi:

143

Aby uzyskać tagi git z hashem SHA1 obiektu Tag, możesz uruchomić:

git show-ref --tags

Wynik będzie wtedy wyglądał mniej więcej tak:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Każda linia to skrót SHA1 tagu, po którym następuje nazwa tagu z prefiksem refs/tags/.

Jeśli chcesz mieć skrót SHA1 zatwierdzenia, zamiast obiektu znacznika, możesz uruchomić:

git show-ref --tags -d

Spowoduje to uzyskanie wyników takich jak:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

Wiersze kończące się na ^{}rozpoczynają się hashem SHA1 aktualnego zatwierdzenia, na który wskazuje znacznik.

peterjmag
źródło
7
Uwaga, to nie rozróżnia znaczników uproszczonych i oznaczonych. Dla lekkich tagów pokaże zatwierdzenie, a dla tagów z adnotacjami pokaże hash samego obiektu tagu.
Lily Ballard
20
Aby wyświetlić listę tagów z odwołanymi odwołaniami (w przypadku tagów z adnotacjami) użyj git show-ref --tags -d. Znaczniki z usuniętymi odwołaniami są zastępowane za pomocą ^{}.
S. Christoffer Eliesen
49

Plik git tagKomenda jest słabo rozwinięty. Wiele jest pożądanych, ale ich brakuje, takich jak pełne szczegóły znaczników i znaczniki w kolejności historii zmian.

Zamiast tego lubię to, co daje dokładnie to, czego chcę, ale nie mogę uzyskać od git tag:

git log --oneline --decorate --tags --no-walk

Daje to bardzo ładny, oznaczony kolorami widok tagów w odwrotnej kolejności chronologicznej (tak jak w pełnym logu). W ten sposób nie tylko zobaczysz tagi, ale także skróty skrótów i komunikaty o zatwierdzeniach tagów.


Mam alias do git ti git tagsw następujący sposób:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Uwaga: musiałem użyć przekierowania bash, git tponieważ Git nie obsługuje wywoływania aliasu z innego aliasu (co jest bummer).


Jeśli chcesz zobaczyć datę i godzinę zatwierdzenia, spróbuj:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

Możesz użyć innych formatów daty w --dateopcji, a także w pełni kontrolować dane wyjściowe, aby dopasować je do swojego wyjątkowego gustu w --prettyopcji. Obie opcje są dobrze udokumentowane w dokumentacji git-log .

ADTC
źródło
2
Chociaż nie jest to to, o co prosił OP (wyświetlanie haszów zatwierdzeń sha1 ), jest to bardzo przydatne, ponieważ komunikaty o zatwierdzeniach również mogą być przydatne. +1 ode mnie.
Stelios Adamantidis
2
@nealmcb git logjest potężny! Możesz sprawić, by pokazywał dokładnie to, czego chcesz. Spróbuj git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Możliwe są również inne formaty daty. Wystarczy spojrzeć --datena stronę pomocy. Zaktualizowałem moją odpowiedź, aby uwzględnić tę opcję.
ADTC,
1
@SteliosAdamantidis Właściwie moja odpowiedź zawiera skrócone skróty SHA1 (pierwsze 7 znaków), a jeśli chcesz mieć skróty o pełnej długości, zawsze możesz je zmodyfikować za pomocą --prettyi %H. Dziękuję za +1 :)
ADTC
15

Znaczniki z adnotacjami mają swoje własne SHA − 1, więc musimy je usunąć. Jednak lekkich znaczników nie można wyłuskać, ponieważ wskazują one już na zatwierdzenie. Aby rozwiązać, musimy wymienić oba i przefiltrować obiekty zatwierdzone:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Wynik z lekkimi tagami:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Wynik z oznaczonymi tagami:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}
Steven Penny
źródło
Użycie git log --tags --oneline --no-walkspowoduje również automatyczne uwzględnienie tagów z adnotacjami. :)
ADTC,
11

Aby uzyskać SHA1, do którego odwołuje się jakikolwiek ref (gałąź, tag ...) użyj git rev-parse:

git rev-parse tag1^0 tag2^0

Wypisze tylko pełne SHA1 w osobnych wierszach. ^0Przyrostek jest specjalna składnia, aby upewnić się, że to będzie drukować SHA1 od zmian wskazywanego przez znacznik, czy to adnotacją, czy nie. (Tagi z adnotacjami są obiektami same w sobie, które zawierają wskaźnik do zatwierdzenia wraz z metadanymi. Jeśli wiesz, że znacznik jest opatrzony adnotacją i chcesz, aby znacznik był SHA1, po prostu zostaw znak ^0.)

Oczywiście nie powinieneś tego często robić, ponieważ każde polecenie Git, które zaakceptowałoby SHA1, powinno również akceptować tag!

Cascabel
źródło
Najlepsza odpowiedź tutaj, dzięki @Jefromi. Zauważ, że w powłoce cmd Windows każde polecenie git używające ^ musi być cytowane: np. Git rev-parse "tag1 ^ 0" "tag2 ^ 0".
jojo
8

Miałem podobne pytanie, ale chciałem skasować (kilka) określonych tagów. Zauważyłem, że „show-ref” pobierze listę tagów, więc to spełnia swoje zadanie:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Jednak pewne eksperymenty z „git show” zaowocowały następującym poleceniem:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

Ponieważ jestem znacznie bardziej zaznajomiony z używaniem „show” niż „show-ref”, uważam, że to drugie jest łatwiejsze do zapamiętania i jest też bardziej pomocne.

Zobacz także ładne podsumowanie w Jak sprawdzić, na które zatwierdzenie wskazuje tag w Gicie? .

Przetrząsać
źródło
3

Tagi muszą być podpisane i / lub przesłane. Lekkie tagi nie mają obiektów SHA1 i są tylko referencjami. W przeciwnym razie spróbuj git show.

Adam Dymitruk
źródło
3
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

To daje listę wszystkich zatwierdzeń dla tagów. Tagi z adnotacjami są wyłuskiwane. Wyślij podziękowania tutaj .

anatoly techtonik
źródło
Świetne rozwiązanie. Jeśli chcesz mieć tylko nazwy tagenames zamiast pełnej nazwy odniesienia, możesz zmienić użycie %(refname:short)zamiast %(refname).
Radon8472
2

Wziąłem polecenie z postu anatoly techtonik, dodałem nagłówek wiadomości tagów / zatwierdzeń i sformatowałem go jako ładne kolumny.

Rezultatem jest dane wyjściowe identyczne, git tag -nale z przedrostkiem commita-hash.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Jeśli chcesz mieć długie-hash zamiast krótki, yust zastąpić objectname:shortprzez objectname.

Radon8472
źródło