Jak uzyskać najnowszą nazwę tagu w bieżącej gałęzi w Git?

Jaki jest najprostszy sposób na uzyskanie najnowszego tagu w Git?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

Wyjście:

a
b
c

Czy powinienem napisać skrypt, aby pobrać datetime każdego tagu i porównać je?

Author: Zoe, 2009-09-10

19 answers

Możesz rzucić okiem na git describe, który robi coś podobnego do tego, o co prosisz.

 318
Author: JB.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 11:58:14

Aby uzyskać najnowszy tag:

git describe --tags

Aby pobrać najnowsze adnotacje tag:

git describe --abbrev=0 --tags
 482
Author: acassis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 18:43:48

Wyświetli znacznik ostatniego oznaczonego commita we wszystkich gałęziach

git describe --tags $(git rev-list --tags --max-count=1)
 231
Author: kilianc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-16 16:49:07

Aby uzyskać najnowszy tag, możesz zrobić:

$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1

Oczywiście możesz zmienić argument count lub pole sortowania zgodnie z życzeniem. Wygląda na to, że że może miałeś na myśli zadać nieco inne pytanie, ale to odpowiada na pytanie, jak je interpretuję.

 30
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 20:57:37

Co ty na to?

TAG=$(git describe $(git rev-list --tags --max-count=1))

Technicznie rzecz biorąc, niekoniecznie będzie to najnowszy tag, ale najnowszy commit, który jest oznaczony, który może, ale nie musi być tym, czego szukasz.

 24
Author: Wincent Colaiuta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-09 06:35:30

git describe --tags

Zwraca ostatni znacznik widoczny dla bieżącej gałęzi

 19
Author: dmasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 17:22:33

"najnowszy" może mieć dwa znaczenia pod względem Gita.

Możesz mieć na myśli, "który tag ma datę utworzenia najnowszą w czasie", a większość odpowiedzi tutaj są na to pytanie. Jeśli chodzi o twoje pytanie, chciałbyś zwrócić tag c.

Lub możesz mieć na myśli" który tag jest najbliższy w historii rozwoju jakiejś nazwanej gałęzi", zazwyczaj gałęzi, na której się znajdujesz, HEAD. W twoim pytaniu zwróci tag a.

Mogą być różne od przebieg:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

Wyobraź sobie, że programista tagował Z jako v0.2 W poniedziałek, a następnie tagował Q jako v0.1 we wtorek. {[7] } jest nowszą, ale v0.2 jest bliższa w historii rozwoju, w tym sensie, że ścieżka, którą podąża, zaczyna się w punkcie bliżej głowy.

Myślę, że Zwykle chcesz tej drugiej odpowiedzi, bliższej w historii rozwoju. Możesz to sprawdzić używając git log v0.2..HEAD etc dla każdego tagu. Daje to liczbę commitów NA HEAD od zakończenia ścieżki v0.2 / align= "left" /

Oto skrypt Pythona, który robi to poprzez iterację wszystkich tagów uruchamiających to sprawdzanie, a następnie drukowanie znacznika z najmniejszą liczbą commitów na głowie, odkąd ścieżka znacznika się rozeszła:

Https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describe robi coś nieco innego, w tym, że śledzi wstecz od (np.) HEAD, aby znaleźć pierwszy tag, który jest na ścieżce wstecz w historii od HEAD. W git terms, git describe szuka tagów, które są "osiągalne" z głowy. W związku z tym nie znajdzie znaczników takich jak v0.2, które nie znajdują się na ścieżce powrotnej od głowy, ale ścieżkę, która oddzieliła się od niej.

 17
Author: Matthew Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-11 19:11:35
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

JEŚLI POTRZEBUJESZ WIĘCEJ NIŻ JEDNEGO OSTATNIEGO ZNACZNIKA

(git opisz --tags czasami podaje błędne hashe, Nie wiem dlaczego, ale dla mnie --max-count 2 nie działa)

W ten sposób możesz uzyskać listę z najnowszymi 2 nazwami tagów w odwrotnej kolejności chronologicznej, działa idealnie na git 1.8.4. Dla wcześniejszych wersji git(jak 1.7.* ), nie ma na wyjściu napisu "tag:" - po prostu usuń ostatnie wywołanie sed

Jeśli chcesz więcej niż 2 najnowsze tagi-zmień to " sed 2Q "na" sed 5q " lub whatever you need

Następnie możesz łatwo przetworzyć każdą nazwę znacznika do zmiennej lub tak.

 10
Author: east,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-15 10:21:03
git tag -l ac* | tail -n1

Pobierz ostatni znacznik z prefiksem " ac " . Na przykład znacznik o nazwie ac1.0.0 lub ac1.0.5. Inne tagi o nazwie 1.0.0, 1.1.0 zostanie zignorowany.

git tag -l [0-9].* | tail -n1

Pobierz ostatni znacznik, którego pierwszy znak to 0-9. Tak więc znaczniki z pierwszym znakiem a-z będą ignorowane.

Więcej informacji

git tag --help # Help for `git tag`

git tag -l <pattern>

Lista znaczników z nazwami, które pasują do podanego wzorca (lub wszystkie, jeśli nie wzór podany). Uruchamianie "git tag" bez argumentów również wyświetla wszystkie tagi. Wzorzec jest powłoką wieloznaczną (tj. dopasowaną za pomocą fnmatch (3) Można podać wiele wzorów; jeśli któryś z nich mecze, znacznik jest wyświetlany.


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

Update

Z git tag --help, o argumencie sort. Domyślnie użyje lexicorgraphic order, Jeśli właściwość tag.sort nie istnieje.

Kolejność sortowania domyślna wartość skonfigurowana dla tagu.Sortuj zmienną, jeśli to istnieje, czyli porządek leksykograficzny inaczej. Patrz git-config(1).

Po google, ktoś powiedział Git 2.8.0 obsługuje składnię.

git tag --sort=committerdate
 8
Author: AechoLiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:30

git describe --abbrev=0 --tags

Jeśli nie widzisz znacznika latest, upewnij się, że pobierasz origin przed uruchomieniem tego znacznika:

git remote update

 7
Author: Walter B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 14:40:13

Co jest źle {[13] } ze wszystkimi sugestiami(z wyjątkiem Matthew Brett Wyjaśnienie, aktualne w tym poście odpowiedzi)?

Po prostu uruchom dowolną komendę dostarczoną przez inne na jQuery Git history, gdy w w innym punkcie historii i sprawdź wynik za pomocą visual tagging history representation (i did dlatego widzisz ten post):

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

Obecnie wiele projektów wykonuje Wydania (a więc tagowanie) W oddzielnej gałęzi od mainline .

Istnieją silne powody do tego. Wystarczy spojrzeć na wszelkie dobrze ugruntowane projekty JS / CSS. Dla konwencji użytkownika przenoszą binarne / minified release pliki w DVC. Oczywiście jako opiekun projektu nie chcesz wysysać historii różnic linii głównej bezużytecznymi binarnymi blobami i wykonywać commit artefaktów budowania z linii głównej.

Ponieważ Git używa DAG, a nie Historii liniowej-trudno jest zdefiniować metrykę odległości więc możemy powiedzieć-Och, że rev jest najbardziej najbliższy mojej HEAD!

Zaczynam własną podróż w (zajrzyj do środka, nie skopiowałem fantazyjnych zdjęć do tego długiego posta):

Jaki jest najbliższy tag w przeszłości w odniesieniu do rozgałęzień w Git?

Obecnie mam 4 rozsądne definicje odległości między tagiem a rewizją ze zmniejszeniem użyteczności:

  • długość najkrótszej ścieżki od HEAD do połącz bazę z tag
  • Data z połącz bazę pomiędzy HEAD i tag
  • Liczba obrotów które są dostępne z głowicy, ale nie są dostępne z znacznika
  • Data tagu niezależnie merge base

Nie wiem jak obliczyć długość najkrótszej ścieżki .

Skrypt sortujący znaczniki według date of merge base between HEAD and tag:

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

Nadaje się do większości projekty.

Skrypt sortujący znaczniki według liczby obrotów które są dostępne z głowy, ale nie są dostępne z tagu:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

Jeśli historia twojego projektu ma dziwne daty NA commitach (z powodu rebasów lub innego przepisywania historii lub jakiś Kretyn zapomniał wymienić baterię BIOS lub inne magiki, które robisz na historii) użyj powyższego skryptu.

Dla ostatniej opcji (date tagu niezależnie merge base) aby uzyskać listę tagów posortowanych według daty użycie:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

Aby poznać aktualną datę aktualizacji użyj:

$ git log --max-count=1

Zauważ, że git describe --tags mają zastosowanie we własnych przypadkach, ale nie do znalezienia oczekiwanego najbliższego znacznika w historii projektu .

Uwaga możesz użyć powyższych przepisów na dowolnej wersji, po prostu zamień HEAD na to, co chcesz!

 7
Author: gavenkoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:45

Poniższy tekst działa dla mnie w przypadku, gdy potrzebujesz ostatnich dwóch tagów(na przykład, aby wygenerować dziennik zmian między bieżącym tagiem a poprzednim tagiem). Testowałem go tylko w sytuacji, gdy ostatnim tagiem był HEAD.

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

Odpowiada moim potrzebom, ale ponieważ nie jestem git wizardem, jestem pewien, że można go jeszcze ulepszyć. Podejrzewam również, że pęknie w przypadku, gdy historia zmian przesunie się do przodu. Dzielę się, na wypadek, gdyby komuś to pomogło.

 4
Author: Ivan Vučica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-22 17:10:41

Możesz wykonać: git describe --tags $(git rev-list --tags --max-count=1) talked here: Jak uzyskać najnowszą nazwę tagu?

 3
Author: xserrat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 15:01:32

Moja pierwsza myśl jest taka, że możesz użyć git rev-list HEAD, który wymienia wszystkie obroty w odwrotnej kolejności chronologicznej, w połączeniu z git tag --contains. Gdy znajdziesz ref, gdzie git tag --contains tworzy listę niepotwierdzoną, znajdziesz najnowsze znaczniki.

 2
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 12:03:18

Jeśli chcesz znaleźć ostatni znacznik, który został zastosowany w konkretnej gałęzi, możesz spróbować:

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
 1
Author: Scyssion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 15:56:48

Jest to stary wątek, ale wydaje się, że wielu ludziom brakuje najprostszej, najłatwiejszej i najbardziej poprawnej odpowiedzi na pytanie OP: aby uzyskać najnowszy tag dla bieżącej gałęzi , używasz git describe HEAD. Załatwione.

Edit: możesz również podać dowolną poprawną nazwę refname, nawet piloty; tzn. git describe origin/master powie Ci najnowszy znacznik, do którego można dotrzeć z origin / master.

 0
Author: dohpaz42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 21:46:11

Aby uzyskać najnowszy tag tylko na bieżącej gałęzi / nazwie znacznika, który prefiks z bieżącą gałęzią, musiałem wykonać następujące

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

Branch master:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

Branch custom:

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

I moja ostateczna potrzeba zwiększenia i uzyskać tag +1 do następnego tagowania.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
 0
Author: Sankarganesh Eswaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 06:58:58

Na zadane pytanie,

Jak uzyskać najnowszą nazwę tagu w bieżącej gałęzi

Chcesz

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parent mówi git log, aby nie wyszczególniać żadnych połączonych historii, --pretty=%d mówi, aby pokazywać tylko dekoracje, tzn. lokalne nazwy dla wszelkich commitów. grep -m1 mówi "dopasuj tylko jeden", więc dostajesz tylko najnowszy tag.

 0
Author: jthill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 17:20:39

Jeśli Twoje tagi są sortowalne:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
 0
Author: Clintm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 17:21:00