Jak mogę wyświetlić listę wszystkich tagów w moim repozytorium Git według daty ich utworzenia?


128

Potrzebuję sposobu, aby wyświetlić listę wszystkich tagów w moim systemie przed datą ich utworzenia, ale nie jestem pewien, czy mogę uzyskać te dane za pośrednictwem git-log. Pomysły?


2
Czy masz na myśli, że chcesz otrzymać listę wszystkich tagów w kolejności ich utworzenia?
lithuak

3
FYI (1.) To pytanie dotyczy listy tagów ANNOTATED według daty. (2.) Listę znaczników LIGHTWEIGHT według daty można znaleźć tutaj . (3.) Aby uzyskać pomocne przypomnienie o różnicy między lekkimi tagami Git a tagami z adnotacjami, przejdź tutaj .
Trevor Boyd Smith

@TrevorBoydSmith: To nie jest do końca poprawne. Różnica polega na tym, że (2) wymienia wszystkie tagi według daty popełnienia z następujących oznaczone popełnić , niniejsza strona zawiera rozwiązania, które sortować według daty oznaczone (choć tylko dla adnotacjami tagów, ponieważ git nie data store oznaczone lekkich tagów).
David P

Odpowiedzi:


174

Sortowanie według daty utworzenia tagu działa z opisanymi i lekkimi tagami:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags

12
Niesamowite. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagszrobił dokładnie to, czego potrzebowałem. Dzięki!
Jon Ursenbach

21
Rozwiązanie @DrorCohen, które działa dla lekkich tagów: stackoverflow.com/questions/6900328/… . Wklejam tutaj dla łatwiejszego odniesienia: git log --tags --simplify-by-decoration --pretty = "format:% ai% d"
Gilead

5
%(contents)W razie potrzeby można użyć do dodania adnotacji, np.git for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins

7
Albo nawet trochę czyściej:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers,

4
--sort=creatordatedziała zarówno dla tagów z adnotacjami, jak i bez adnotacji, ale --sort=taggerdatewydaje się działać tylko z tagami z adnotacjami. testowane przy użyciugit version 2.16.3
austinheiman

56

Git 2.8 (marzec 2016) dokumentuje inną opcję sięgającą wstecz do gita 1.4.4 (październik 2006) .
Zobacz commit e914ef0 (05 stycznia 2016) autorstwa Erica Wonga ( ele828) .
(Scalone przez Junio ​​C Hamano - gitster- w zobowiązaniu 108cb77 , 20 stycznia 2016 r.)

Zobacz nowe Documentation/git-for-each-ref.txt

W przypadku obiektów zatwierdzonych i oznaczonych, pola specjalne creatordatei creator będą odpowiadały odpowiedniej krotce data lub nazwa-e-mail-data z pól committerlub, w taggerzależności od typu obiektu.
Są one przeznaczone do pracy nad połączeniem oznaczonych i lekkich tagów .

Więc używanie creatordatedziała z tagami:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

Lub:

git tag --sort=-creatordate 

Jak szczegółowo opisałem w „ Jak sortować tagi git według kolejności ciągów wersji w postaci rc-XYZW? ”, Możesz dodać porządek sortowania do git tag(od Git 2.0 czerwiec 2014).

Ta kolejność sortowania obejmuje jako nazwę pola (wymienioną w git for-each-ref) taggerdate . To pozwala na git tag --sort=taggerdate(wspomniane przez DarVar poniżej )
Na przykład w git/gitrepozytorium wyświetli v2.10.0tag jako ostatni:

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

Domyślna kolejność nie ( git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0

Wielkie dzięki. Zastanawiałem się, dlaczego niektóre daty są puste. Podejrzewałem już lekkie metki. Cieszę się, że nie muszę odtwarzać tagów dzięki creatordate!
exhuma

35
git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Również ładne wyjście z (bez pola daty):

git log --tags --decorate --simplify-by-decoration --oneline

Aby zobaczyć pełną historię z zależnościami i zatwierdzeniami liniowymi w paski (tylko niezbędne zdarzenia, takie jak tagowanie i rozgałęzianie / scalanie):

git log --graph --decorate --simplify-by-decoration --oneline --all

Dla leniwych: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"i dla mnie to działa najlepiej.
Mateusz

1
Zauważ, że jest to uporządkowane według daty zatwierdzenia, a nie daty utworzenia znaczników. (Obecnie) najwyżej oceniana odpowiedź od Josha Lee porządkuje według daty utworzenia tagu.
Nathanial Woolls

13
git tag --sort=-taggerdate

Zgodnie ze stroną podręcznika „Prefiks - sortowanie w porządku malejącym wartości”.

git tagużywa tych samych kluczy sortowania git-for-each-ref, co, gdzie klucze są dokumentowane.


1
Jest to prawdopodobnie najbardziej poprawne pytanie. Oto link do docs nakreślenie możliwych pól sortowania: git-scm.com/docs/git-for-each-ref
prasanthv

Ta odpowiedź nie uwzględnia lekkich tagów, ponieważ mają one puste „taggerdate”. Inne odpowiedzi z „kreacją” są dokładniejsze.
morhook

13

Ta jednowierszowa wyświetla daty i tagi bez problemu.

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

Wynik:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

Jeśli nie podoba ci się domyślne sortowanie tagów, możesz --sort=creatordatena przykład posortować według daty za pomocą opcji . Zobacz odpowiedź VonC, aby uzyskać więcej informacji.


Czy ta miła metoda ma na celu sortowanie ich według daty? rosnąco? malejąco?
Motti Shneor

11

Aby całkowicie posortować tagi z adnotacjami i lekkie tagi na podstawie daty zatwierdzenia, używam:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

To polecenie wyświetli wszystkie znaczniki i powiązany identyfikator obiektu zatwierdzenia, w porządku chronologicznym.


Trochę zaciemnione. ... W tagach z adnotacjami „committerdate” jest puste, podczas gdy w lekkich tagach „taggerdate” jest puste. Aby obejść ten problem, „* committerdate” mówi Gitowi, aby odwoływał się do dat z oryginalnego obiektu commit, gdy jest on lekki. ...
ingyhere

Zamiast tego użycie „creatordate” powinno skutecznie zrobić to samo.
ingyhere

7

Dzięki Git version 2.10.0.windows.1

git tag --sort=taggerdate


5

Następujące elementy zależą od zatwierdzenia, więc nie ma znaczenia, czy zawiera informacje o dacie z zatwierdzeniem:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

Powyższa odpowiedź Josha Lee opiera się na dacie tagu, aby uzyskać poprawną kolejność.


Nie jestem pewien, jakie jest końcowe polecenie tac- może zmienić je na more. W każdym razie Twoje polecenie zadziałało świetnie - dzięki!
David H


3

Opierając się na wspomnianych wcześniej metodach, chciałem również zobaczyć aktualną datę tagu na liście, więc moja wersja użytkowa to:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
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.