2013-07-01 14 views
28

Piszę skrypt powłoki i czekam na kasę najnowszą wersję repo. W szczególności chcę podzielić ten proces na wiele kroków.Git Checkout Najnowszy tag

  1. chcę zapisać repozytoriach najnowszy znacznik do zmiennej
  2. wydrukować Checking out version: XX
  3. Checkout ostatni tag

Widziałem similar questions ale nie widzę jak oszczędzać nazwę znacznika do zmiennej (prawdopodobnie dlatego, że jestem noobem ze skryptami powłoki).

+0

możliwy duplikat [Jak uzyskać najnowszą nazwę tagu w bieżącym oddziale w Git?] (Http://stackoverflow.com/questions/1404796/how-to-get-the-latest-tag-name-in- current-branch-in-git). Tylko duplikat, ponieważ jawnie potrzebujesz 'Chcę zapisać nowy znacznik repozytoriów w zmiennej', reszta to po prostu Bash. –

Odpowiedz

13

powinien dać ci informacje.

bash/shell script:

#!/bin/bash 
... 
latesttag=$(git describe --tags) 
echo checking out ${latesttag} 
git checkout ${latesttag} 
+1

Ale jak zapisać krok 1 w zmiennej? Wiem, jak wydrukować go na ekranie. – BFTrick

+1

używając 'var = $ (command)' – exussum

+0

To działało! Dzięki! :) – BFTrick

2

W celu wprowadzenia informacji do zmiennej, przypisać go:

myvar=myvalue 

jednak chcesz obliczyć wartość przypisać, ty nie tylko przypisuje stałą do zmiennej. W twoim przypadku chcesz przypisać dane wyjściowe polecenia do zmiennej.

Najpierw musisz dowiedzieć się, jak zdobyć ostatnią nazwę tagu. Zostawię to tobie, ponieważ nie powiedziałeś nic o tworzeniu nazw tagów.

Następnie, gdy otrzymasz polecenie, które podaje ostatnią nazwę znacznika, musisz przypisać nazwę do zmiennej. Bash robi to z "podstawieniem polecenia".

Na przykład: thetagname=$(command_to_get_tag_name)

Więc jeśli były po prostu wziąć ostatni znak, że raporty git jak ten:

git tag | tail -1 

następnie można przypisać ją do zmiennej tak:

thetagname=$(git tag | tail -1) 

i można użyć/zobacz wartość podobną do poniższej:

echo $thetagname 

lub user1281385 mówi tak:

echo ${thetagname} 

dwóch metod są takie same, z wyjątkiem, że drugi sposób pozwala na łączenie tekstu dosłownego o wartości zmiennej:

echo ${thetagname}ing 

który doda "ing" do zawartości $ zmiennej. Klamry są konieczne, aby zapobiec myśleniu, że "zmienna" jest zmienną.

Strona man bash zawiera sekcję o nazwie EXPANSION, w której wyjaśnia 7 rodzajów ekspansji. Podstawienie poleceń jest jednym z nich. Strona bash man jest dość duża i powtarza wiele interesujących słów kluczowych wiele razy, więc szukanie rzeczy w tym jest naprawdę irytujące.Oto kilka wskazówek, jak znaleźć części rozszerzającej (i dowiedzieć się trochę o pager „mniej”):

start ręczny czytnik czytając stronę man bash tak:

man bash 

Szukaj dla terminu "EXPANSION" na początku linii, gdy jesteś w czytniku, wpisując /^EXPANSION na wyświetlaczu. Po wpisaniu / zobaczysz/u dołu ekranu, ale strona podręcznika będzie tam nadal. To jest polecenie wyszukiwania wzorca. Następnie wpisujesz ^EXPANSION, a zobaczysz to również na dole ekranu.^oznacza "szukanie rzeczy na początku linii", a EXPANSION oznacza "szukaj literalnego ciągu znaków" ROZSZERZENIE ", następnie wpisz <enter> - i powinieneś być na pierwszym wystąpieniu terminu ROZSZERZENIE występującego na początku wiersza W tym miejscu opisano wszystkie rodzaje rozszerzeń, jakie powłoka bash wykonuje na linii po jej wpisaniu, a przed wykonaniem transformowanego polecenia:

W pager można wpisać h, aby uzyskać listę możliwych poleceń .

mam nadzieję, że nie było to zbyt proste. Jeśli nie widziałem go wcześniej, trudno się dowiedzieć.

2

W niektórych składowisk z git describe --tags nie podaje żadnych informacji, a prosty git tag | tail -1 może ci zmyć błędny tag, ponieważ git sortuje znaczniki w dziwny sposób.

Dla mnie najlepsza komenda jest odmianą ogona jeden

WERSJA = $ (git tag | sort -V | tail -1)

+0

sort: invalid option - V – Andy

+0

JEŻELI twoje wersje to XXX: 'VERSION = $ (tag git | grep"^[0-9] \ + \. [0-9] \ + \. [0-9] \ + $ "| sort -t. -k 1,1n -k 2,2n -k 3,3n | ogon -1)' –

60
# Get new tags from remote 
git fetch --tags 

# Get latest tag name 
latestTag=$(git describe --tags `git rev-list --tags --max-count=1`) 

# Checkout latest tag 
git checkout $latestTag 
+4

Jeszcze bardziej gęsty, pomiń zmienną 'git checkout $ (git opisuj --tags 'git rev-list --tags --max-count = 1')' – ThorSummoner

+1

@ThorSummoner dziękuje, ale twoje tyłki zostały zgubione w formatowaniu. Używanie zagnieżdżonych '$()' s zamiast: 'git checkout $ (git opisz --tags $ (git rev-list --tags --max-count = 1)) –

0

„git tag - -contains | tail -1 ", (tag git --contains) wyświetla wszystkie znaczniki w bieżącej gałęzi, (tail -1) ogranicza liczbę wyników wyjściowych do l, i jest najnowsza.