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
wynik:
a
b
c
Czy powinienem napisać skrypt, aby uzyskać datę i godzinę każdego tagu i porównać je?
git
git-checkout
git-tag
getlatest
culebrón
źródło
źródło
Odpowiedzi:
Możesz rzucić okiem
git describe
, co robi coś bliskiego temu, o co pytasz.źródło
--abbrev=0
nią powinien zwrócić najbliższy tag z komentarzemgit describe --exact-match --abbrev=0
.git describe --tags
i porównaj com ostatni tag na stronie wydania githubAby uzyskać najnowszy tag:
Aby uzyskać najnowszy tag z adnotacjami :
źródło
git describe
mówi strona--abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
Wysyła tag najnowszego zatwierdzonego zatwierdzenia we wszystkich gałęziach
źródło
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursellAby uzyskać najnowszy tag, możesz:
Oczywiście możesz zmienić argument licznika lub pole sortowania według potrzeb. Wygląda na to, że mogłeś zadać nieco inne pytanie, ale to odpowiada na pytanie, gdy je interpretuję.
źródło
--sort=-authordate
i--sort=authordate
.--sort=-taggerdate
. Dla tagówauthordate
icommitterdate
są puste (tak bezużyteczne jak klucze sortowania).git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
jest jeszcze lepszy :)--points-at=$SHA
da ci tag skrótu zatwierdzenia.Co powiesz na to?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Technicznie niekoniecznie dostaniesz najnowszy tag, ale ostatni zatwierdzony tag, który może, ale nie musi być tym, czego szukasz.
źródło
--tags=<pattern>
wrev-list
. Na przykład pobierz tag ostatniej wersjigit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Możesz wykonać:
git describe --tags $(git rev-list --tags --max-count=1)
rozmawiałem tutaj: Jak uzyskać najnowszą nazwę tagu?źródło
git describe ...
zwraca wcześniejszy tag ?!)--abbrev=0
odpowiedzi i odciąłem część tagu, który chcę.„Najnowsze” może mieć dwa znaczenia pod względem git.
Możesz powiedzieć „który tag ma datę utworzenia najpóźniej w czasie”, a większość odpowiedzi tutaj dotyczy tego pytania. Jeśli chodzi o twoje pytanie, chciałbyś zwrócić tag
c
.Lub może masz na myśli „która znajduje się najbliżej tag w historii rozwoju do pewnego nazwie oddziału”, zwykle gałęzi na której się znajdujesz,
HEAD
. W twoim pytaniu zwróci to taga
.Mogą być oczywiście inne:
Wyobraźmy sobie, deweloper tag'ed
Z
jakv0.2
w poniedziałek, a następnie tag'edQ
jakv0.1
we wtorek.v0.1
jest nowszy, alev0.2
bliżej historii rozwoju do HEAD, w tym sensie, że ścieżka, którą podąża zaczyna się w punkcie bliższym HEAD.Myślę, że zwykle potrzebujesz drugiej odpowiedzi, bliżej historii rozwoju. Możesz się tego dowiedzieć, używając
git log v0.2..HEAD
etc dla każdego tagu. Daje to liczbę zatwierdzeń w HEAD, ponieważ ścieżka kończąca się nav0.2
odbiegała od ścieżki, po której następuje HEAD.Oto skrypt w języku Python, który robi to poprzez iterację wszystkich tagów wykonujących tę kontrolę, a następnie wydrukowanie tagu z najmniejszą liczbą zatwierdzeń w HEAD od czasu rozejścia się ścieżki tagu:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
robi coś nieco innego, ponieważ śledzi wstecz (np.) HEAD, aby znaleźć pierwszy znacznik, który znajduje się na ścieżce wstecz w historii od HEAD. Mówiąc git,git describe
szuka tagów „osiągalnych” z HEAD. Dlatego nie znajdzie takich tagówv0.2
, które nie znajdują się na ścieżce powrotnej od HEAD, ale na ścieżce, która się od niej różni.źródło
git describe --tags
zwraca ostatni znacznik widoczny dla bieżącej gałęzi
źródło
JEŚLI POTRZEBUJESZ WIĘCEJ NIŻ JEDNA OSTATNIA TAGA
(git opisz - tagi czasami dają nieprawidłowe hasze, nie wiem dlaczego, ale dla mnie - max-count 2 nie działa)
w ten sposób możesz uzyskać listę z 2 najnowszymi nazwami znaczników w odwrotnej kolejności chronologicznej, działa idealnie na git 1.8.4. We wcześniejszych wersjach git (jak 1.7. *) W danych wyjściowych nie ma łańcucha „tag:” - wystarczy usunąć ostatnie wywołanie sed
Jeśli chcesz więcej niż 2 najnowsze tagi - zmień to „sed 2q” na „sed 5q” lub cokolwiek potrzebujesz
Następnie możesz łatwo parsować każdą nazwę znacznika na zmienną lub inną.
źródło
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
gdzie in%D
wyklucza otaczające()
znaki, ased
s zaczynające się od 5q pozostawia 4 wiersze przed 5, a następnie wypisuje wszystkie znaki między „tag:” a pierwszym „,”. Więc ... zakładając, że w tagu nie ma przecinków, działa to idealnie.Co jest złego we wszystkich sugestiach (oprócz wyjaśnień Matthew Bretta , aktualnych odpowiedzi na ten post)?
Po prostu uruchom dowolne polecenie dostarczone przez innych w historii jQuery Git, gdy jesteś w innym punkcie historii i sprawdź wynik za pomocą wizualnej reprezentacji historii tagowania ( zrobiłem właśnie dlatego widzisz ten post):
Obecnie wiele projektów wykonuje wydania (a więc oznaczanie) w oddzielnej gałęzi od głównej linii .
Jest ku temu silny powód . Wystarczy spojrzeć na wszelkie dobrze znane projekty JS / CSS. Zgodnie z konwencjami użytkowników przenoszą one binarne / zminimalizowane pliki wydań w DVCS. Naturalnie, jako opiekun projektu, nie chcesz usuwać swojej historii różnic głównych z bezużytecznymi binarnymi obiektami blob i wykonywać zatwierdzanie kompilacji kompilacji poza linią główną .
Ponieważ Git używa DAG, a nie historii liniowej - trudno jest zdefiniować metrykę odległości, więc możemy powiedzieć - och, ta prędkość jest najbliższa mojej
HEAD
!Zaczynam własną podróż (zajrzyj do środka, nie skopiowałem fantazyjnych zdjęć próbnych do tego długiego postu):
Jaki jest najbliższy tag w przeszłości w odniesieniu do rozgałęziania w Git?
Obecnie mam 4 rozsądne definicje odległości między tagiem a wersją ze zmniejszeniem użyteczności:
HEAD
do połączenia bazy ze znacznikiemHEAD
i znacznikaNie wiem, jak obliczyć długość najkrótszej ścieżki .
Skrypt tagi sortowania według daty z bazy seryjnej pomiędzy
HEAD
i TAG:Nadaje się do większości projektów.
Skrypt sortujący tagi według liczby obrotów osiągalnych z HEAD, ale niedostępnych z tagu:
Jeśli historia twojego projektu ma dziwne daty na zatwierdzeniach (z powodu rebaseów lub innego przepisywania historii lub jakiegoś kretyna, zapomnij wymienić baterię BIOS lub inną magię, którą robisz w historii), użyj powyższego skryptu.
Aby uzyskać ostatnią opcję ( datę znacznika niezależnie od podstawy scalania ), aby uzyskać listę znaczników posortowaną według daty, użyj:
Aby poznać aktualną datę zmiany, użyj:
Zauważ, że
git describe --tags
mają zastosowanie we własnych przypadkach, ale nie do znajdowania oczekiwanego przez człowieka najbliższego znacznika w historii projektu .UWAGA Możesz stosować powyższe przepisy w każdej wersji, wystarczy zastąpić
HEAD
to, co chcesz!źródło
git describe --abbrev=0 --tags
Jeśli nie widzisz najnowszego tagu, upewnij się, że pobierasz pochodzenie przed uruchomieniem tego:
git remote update
źródło
Pobierz ostatni tag z prefiksem „ac” . Na przykład znacznik o nazwie z
ac1.0.0
lubac1.0.5
. Inne znaczniki nazwane1.0.0
,1.1.0
będą ignorowane.Zdobądź ostatni tag, którego pierwszym znakiem jest
0-9
. Te tagi z pierwszym chara-z
zostaną zignorowane.Więcej informacji
Aktualizacja
Z
git tag --help
, osort
kłótni. Będzie używaćlexicorgraphic order
domyślnie, jeślitag.sort
właściwość nie istnieje.Po google ktoś powiedział , że obsługuje git 2.8.0 zgodnie ze składnią.
źródło
źródło
Poniższe działa dla mnie, jeśli potrzebujesz dwóch ostatnich znaczników (na przykład, aby wygenerować dziennik zmian między bieżącym i poprzednim znacznikiem). Testowałem to tylko w sytuacji, gdy najnowszy tag był
HEAD
.Odpowiada moim potrzebom, ale ponieważ nie jestem git-magiem, jestem pewien, że można go jeszcze ulepszyć. Podejrzewam też, że się zepsuje, jeśli historia zatwierdzeń pójdzie do przodu. Po prostu dzielę się na wypadek, gdyby komuś to pomogło.
źródło
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 zgit tag --contains
. Gdy znajdziesz referencję, w którejgit tag --contains
powstaje niepusta lista, znalazłeś najnowsze tagi.źródło
Jeśli chcesz znaleźć ostatni tag, który został zastosowany w konkretnej gałęzi, możesz spróbować:
źródło
Jeśli potrzebujesz jednego linera, który pobiera najnowszą nazwę tagu (według daty tagu) w bieżącym oddziale :
Używamy tego do ustawienia numeru wersji w konfiguracji.
Przykład wyjściowy:
Działa również w systemie Windows.
źródło
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) I pomijam,--points-at=HEAD
to działa. Z tym ostatnim przełącznikiem nic nie zwraca, bo chyba mójHEAD
tag nie jest oznaczony?HEAD
nie jest oznaczony.To jest 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żącego oddziału , używasz
git describe HEAD
. Gotowy.Edycja: możesz także podać dowolną prawidłową nazwę, nawet piloty; tzn.
git describe origin/master
powie Ci najnowszy tag, który można uzyskać z origin / master.źródło
for-each-ref
polecenie ( stackoverflow.com/a/5261470/515973 ) oraz połączenierev-list
idescribe
( stackoverflow.com/a/7979255/515973 )git describe branchname --tags
działa dla mnie, aby uzyskać najnowszy tag na gałęzi (git wersja 2.12.2)Aby uzyskać najnowszy tag tylko dla bieżącej nazwy gałęzi / tagu, która poprzedza bieżącą gałąź, musiałem wykonać następujące czynności
I moja ostatnia potrzeba zwiększenia i uzyskania tagu +1 do następnego tagowania.
źródło
W przypadku zadanego pytania
chcesz
--first-parent
mówi,git log
aby nie wyszczególniać żadnych połączonych historii,--pretty=%d
mówi, aby pokazywać tylko dekoracje, tj. lokalne nazwy dla jakichkolwiek zatwierdzeń.grep -m1
mówi „dopasuj tylko jeden”, więc otrzymujesz tylko najnowszy tag.źródło
jeśli twoje tagi są sortowalne:
źródło
Nie ma tu wiele wzmianek o tagach bez adnotacji w porównaniu z tagami z adnotacjami. „opisz” działa na tagach z adnotacjami i ignoruje te bez adnotacji.
Jest to brzydkie, ale wykonuje zlecenie i nie znajdzie żadnych znaczników w innych gałęziach (a nie w tym określonym w poleceniu: master w poniższym przykładzie)
Filtrowanie powinno być zoptymalizowane (skonsolidowane), ale znowu wydaje się, że to zadanie.
Krytyki są mile widziane, ponieważ zamierzam teraz użyć tego :)
źródło
Innym prostym sposobem na uzyskanie najnowszej nazwy znacznika jest
lub
do przechowywania w zmiennej.
git tag
wyświetla listę wszystkich dostępnych tagów i zwróci ostatni wiersz, jeśli wynik.tail
-1
źródło