Pytanie Pobierz konkretny tag z Git


Próbuję dowiedzieć się, jak mogę pobrać konkretny znacznik repozytorium Git - jest to jedna wersja za aktualną wersją.

Widziałem, że na poprzedniej wersji na stronie git był tag z nazwą obiektu o długim numerze szesnastkowym.

Ale nazwa wersji to "Tagged release 1.1.5"zgodnie z witryny.

Próbowałem takiego polecenia (z nazwami zmienionymi):

git clone http://git.abc.net/git/abc.git my_abc

I dostałem coś - katalog, paczkę podkatalogów itp.

Jeśli jest to całe repozytorium, w jaki sposób mogę uzyskać wersję, której szukam? Jeśli nie, w jaki sposób mogę pobrać tę konkretną wersję?


1661
2018-04-27 01:15


pochodzenie


Rozwijam się na zupełnie innym repo, niż w produkcji, więc moja produkcja nie znała żadnych tagów, gdy próbowałem użyć git-checkout. Rozwiązaniem było użycie "git pull --tags", a następnie użycie git checkout. - Enterprise Architect
"git fetch --tags" też działa - John Erck
Aby uniknąć klonowania całego repozytorium, a następnie przejścia na tag, możesz bezpośrednio zrobić clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Będzie działać tylko wtedy, gdy nie masz oddziału o tej samej nazwie (w zależności od metodologii może się to nigdy nie zdarzyć). - RedGlyph
@RedGlyph Dzięki temu spróbuję. Inaczej możemy to zrobić. git checkout -b new-branch tag-name. Teraz sklonuj swoją nową gałąź. Kiedy chcemy, możemy usunąć nową gałąź. - kalidasan


Odpowiedzi:


$ git clone

da ci całe repozytorium.

Po klonie możesz wyświetlić listę tagów za pomocą $ git tag -l a następnie kasowanie określonego tagu:

$ git checkout tags/<tag_name>

Jeszcze lepiej, sprawdź i utwórz oddział (w przeciwnym razie znajdziesz się w oddziale o nazwie po numerze wersji tagu):

$ git checkout tags/<tag_name> -b <branch_name>

2559
2018-04-27 01:53



Tak. git różni się od subwersji pod tym względem. Znacznik svn zasadniczo kopiuje pliki do nowego folderu, dzięki czemu możesz svn sprawdzić konkretną paczkę plików, podczas gdy tagi git są po prostu wskaźnikami do konkretnych wersji. - dbr
Co jeśli masz gałąź i znacznik o tej samej nazwie? Jeśli po prostu powiesz "git checkout <name>", to znaczy "warning: refname" <name> 'jest niejednoznaczne .. Przełączono na gałąź' <name> '"- jak chcesz powiedzieć, żeby zamiast tego przełączała się na tag? - MatrixFrog
MatrixFrog, aby uniknąć dwuznaczności, uruchom git checkout tags/<name>. W przeciwnym razie Git zakłada, że ​​chciałeś odzyskać oddział <name>. - Derek Mahar
robiąc kasę i jak wspomniał Derek, repo przechodzi w stan "odłączonej głowy". zamiast tego dodaj -b flag telling git, aby utworzyć nowy oddział i podać nazwę oddziału: git checkout <tag_name> -b <branch_name> - hellatan
@hellatan Powinieneś to robić tylko wtedy, gdy rzeczywiście chcesz stworzyć oddział, ale przez większość czasu prawdopodobnie nie. Uruchamianie w stanie "odłączonej głowy" nie zaszkodzi ci i prawdopodobnie jest dokładnie tym, czego chcesz, jeśli chcesz tylko sprawdzić historię git. - machineghost


git clone --branch my_abc http://git.abc.net/git/abc.git

Sklonuje repozytorium i opuści cię na tagu, który cię interesuje.

Dokumentacja dla wersji 1.8.0 git clone stany.

--branch może również przyjmować znaczniki i odłączać HEAD przy tym zatwierdzeniu w wynikowym repozytorium.


269
2018-06-14 09:33



To działa (przynajmniej teraz) w przypadku tagów, ale kończy się oddzielnym stanem HEAD. - mxcl
FYI: Określ także --depth 1 aby uniknąć pobierania długoterminowych zatwierdzeń. - A-B-B
To naprawdę robi nie pracować z tagami. Tylko gałęzie. Edycja: Wygląda na to, że działają tylko nowsze wersje git. - lzap
Możemy również edytować plik .git / config (lub jakoś go skonfigurować), aby zrobić płytki klon dwóch lub więcej tagów, jeśli to konieczne, zaktualizuj płytki klon do pełnego klonu itp. - Sam Watkins
to powinna być zaakceptowana odpowiedź, IMHO. - Sumi Straessle


Nie jestem ekspertem od gita, ale myślę, że to powinno zadziałać:

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

LUB

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

Druga odmiana ustanawia nowy oddział oparty na tagu, który pozwala uniknąć "odłączonego HEAD". (instrukcja git-checkout)

Każde repozytorium git zawiera całą historię zmian, więc klonowanie repo daje ci dostęp do ostatniego zatwierdzenia oraz wszystkiego, co było wcześniej, w tym znacznika, którego szukasz.


94
2018-04-27 01:54



Dzięki. Musiałem użyć git checkout -b b1.5.0 v1.5.0 podczas sprawdzania wersji w gałęzi "gh-pages", aby pomyślnie przejść do stron Github. Ten Gist, który napisałem może pomóc innym w repozytoriach: branch / tag / submodules ... gist.github.com/1064750 - Chris Jacob
Nie sądzę, że jest to całkowicie dokładne (np. Wklejanie do terminala), ponieważ musisz cd w abc/ Najpierw przed wypłatą oddziału - Steven Lu
@StevenLu Masz oczywiście rację. Szukałem raczej koncepcji niż wycinania i wklejania, ale równie dobrze mógłbym być tak dokładny, jak to tylko możliwe. Dodałem cd. - grossvogel


Do sprawdzenia tylko danego znacznika do wdrożenia używam np .:

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

Wydaje się, że jest to najszybszy sposób na wyewidencjonowanie kodu ze zdalnego repozytorium, jeśli interesuje go tylko najnowszy kod zamiast pełnego repozytorium. W ten sposób przypomina polecenie "svn co".


85
2017-07-28 02:35



nie mogę uwierzyć w to, że jest to skomplikowane. zgadnij, nikt nie oczekuje, że ich kod będzie używany przez innych. - Ben
@Ben, to jest najprostsze rozwiązanie (wymagane jest jedno polecenie) - Eliran Malka
@Ben dlaczego jest to skomplikowane? Jest to specjalny przypadek z kilkoma funkcjami, które chcesz zrobić inaczej niż domyślne. Oczywiście musisz to określić. Normalnym rozwiązaniem byłoby wykupienie całego repo w Rozpowszechniane vcs. - erikbwork
@Ben ma rację. git jest skomplikowany i napisany LATA LES temu przez Linusa i jest jedynym, który "naprawdę" rozumie, jak to działa. xkcd.com/1597 - RyanNerd


Możesz użyć archiwum git, aby pobrać kulę tar dla danego tagu lub identyfikatora commit:

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

Możesz również wyeksportować archiwum zip znacznika.

  1. Tagi list:

    git tag
    
    0.0.1
    0.1.0
    
  2. Eksportuj tag:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. Uwagi:

    • Nie musisz określać formatu. Zostanie pobrane przez nazwę pliku wyjściowego.
    • Określenie przedrostka spowoduje eksport twojego kodu do katalogu (jeśli umieścisz ukośny ukośnik).

71
2017-12-09 21:46



To polecenie nie działa z submodułami, zobacz stackoverflow.com/questions/1591387/... - Zitrax
Ale archiwum git usuwa także kontrolę wersji, więc nie możesz po prostu zrobić kolejnej wersji git, aby przejść do następnego tagu. - idbrii
Tak, tracisz kontrolę wersji, ale archiwizuje pliki czasu git w porównaniu z klonem git jest absolutnie niewiarygodny! +1 - MarcH
Jest to TAK ZAMKNIĘTE do tego, co chcę, oprócz tego git archive prosi mnie o hasło, kiedy wszystko, co chcę zrobić, to pobrać z publicznego repozytorium. Jak mogę zrobić to używając http zamiast ssh? - robru
To nie powiedzie się z fatal: Operation not supported by protocol. i Unexpected end of command stream błędy. Alternatywnie może również zwrócić wartość fatal: The remote end hung up unexpectedly błąd. - A-B-B


Użyj --single-branch przełącznik  (dostępne od Git 1.7.10). Składnia jest następująca:

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

Na przykład:

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

Korzyści: Git odbierze obiekty i (będzie trzeba) usunąć delty tylko dla określonej gałęzi / tagu - podczas sprawdzania dokładnie takiej samej ilości plików! W zależności od repozytorium źródłowego zaoszczędzi to dużo miejsca na dysku. (Plus, będzie o wiele szybciej.)


40
2018-06-25 06:28



Ktokolwiek zrzekł się / odrzucił tę odpowiedź: Proszę również zostawić komentarz z krótkim uzasadnieniem. (Po prostu pytam, bo jestem trochę zdezorientowany, ponieważ, afaik, jest to najlepsze rozwiązanie dla danego problemu, a jeśli nie uważasz, chciałbym wiedzieć dlaczego.) Wielkie dzięki. - eyecatchUp
Nie próbuj zbytnio zrozumieć sensu. Twoja odpowiedź jest bardzo dobra, ich pochwały są prawdopodobnie niepotwierdzone ... to jest życie w SOF .. - javadba


najpierw pobierz wszystkie tagi w tym konkretnym pilocie

git fetch <remote> 'refs/tags/*:refs/tags/*'

lub po prostu wpisz

git fetch <remote>

Następnie sprawdź dostępne tagi

git tag -l

następnie przejdź do tego konkretnego tagu, używając poniższego polecenia

git checkout tags/<tag_name>

Mam nadzieję, że to ci pomoże!


21
2017-09-10 18:57





Sprawdziłem Dokumentacja git checkout, ujawniła jedną interesującą rzecz:

git checkout -b <nowa_nazwa_branży> <początek_punktu>   , gdzie <punkt_początkowy> to nazwa zatwierdzenia   na którym rozpocząć nowy oddział;   Domyślnie HEAD

Możemy więc wspomnieć o nazwie znacznika (jako że znacznik to nic innego jak nazwa zatwierdzenia), powiedzmy:

>> git checkout -b 1.0.2_branch 1.0.2
później zmodyfikuj niektóre pliki 
  >> git push --tags

P.S: W Git nie możesz bezpośrednio zaktualizować tagu (ponieważ znacznik jest tylko etykietą do zatwierdzenia), musisz pobrać ten sam znacznik, co gałąź, a następnie zatwierdzić go, a następnie utworzyć osobny znacznik.


14
2018-04-26 14:39



Lub jeśli nie spodziewasz się wprowadzić żadnych zmian i po prostu chcesz sprawdzić, jak kod wyglądał w tym tagu, możesz po prostu sprawdzić tag bez tworzenia oddziału. Otrzymasz tekst wyjaśniający, że jesteś w stanie "odłączonej głowy" i zawsze możesz utworzyć gałąź później, jeśli chcesz. - MatrixFrog


Jeśli twoje tagi można sortować za pomocą linuksa sort polecenie, użyj tego:

git tag | sort -n | tail -1

na przykład. gdyby git tag zwraca:

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 wyświetli:

v1.0.5

git tag | sort -n | tail -2 | head -1 wyświetli:

v1.0.4

(ponieważ poprosiłeś o drugi najnowszy tag)

aby wypróbować tag, najpierw sklonuj repo, a następnie wpisz:

git checkout v1.0.4

... lub jakikolwiek tag potrzebujesz.


14
2018-05-12 12:23



Dopóki nie osiągniesz wersji 1.0.10, a potem wydarzy się coś złego :) - Laurent Grégoire
Aby twoje znaczniki były sortowane chronologicznie: git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags - Bob G
One-liner do automatycznego pobrania najnowszej wersji, git checkout `git tag | sort -n | tail -1` - weiji14
Możesz użyć sort -V zamiast sort -n. Ten pierwszy poprawnie obsługuje wersje, które niekoniecznie są numeryczne, np. "1.2.3". Rozumie również, że "0.4.10" idzie po "0.4.1", a nie po "0.4.2", który -n da tobie. - Mateusz Misiorny


git fetch <gitserver> <remotetag>:<localtag>

===================================

Po prostu to zrobiłem. Najpierw upewniłem się, że znam nazwę pisowni znacznika.

git ls-remote --tags gitserver; : or origin, whatever your remote is called

Dało mi to listę tagów na moim serwerze git do wyboru. Oryginalny plakat znał już nazwę jego tagu, więc ten krok nie jest konieczny dla wszystkich. Dane wyjściowe wyglądały tak, chociaż prawdziwa lista była dłuższa.

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

Wybrałem oznaczenie, które chciałem i przyniosłem to i nic więcej w następujący sposób.

git fetch gitserver Fix_110

Następnie oznaczyłem to na moim komputerze lokalnym, nadając temu tagowi tę samą nazwę.

git tag Fix_110 FETCH_HEAD

Nie chciałem klonować zdalnego repozytorium, jak sugerowali inni ludzie, ponieważ projekt nad którym pracuję jest duży i chcę rozwijać się w miłym, czystym środowisku. Sądzę, że jest to bliższe pierwotnym pytaniom: "Próbuję zrozumieć, w jaki sposób pobrać SZCZEGÓLNĄ TAG", niż rozwiązanie sugerujące klonowanie całego repozytorium. Nie widzę powodu, dla którego ktoś musiałby mieć kopię kodu źródłowego Windows NT i Windows 8.1, jeśli chce spojrzeć na kod źródłowy DOS 0.1 (na przykład).

Nie chciałem też używać polecenia WYJŚCIA, jak sugerowali inni. Miałem wypróbowany oddział i nie chciałem tego wpływać. Moją intencją było pobrać oprogramowanie, które chciałem, abym mógł wybrać coś i dodać to do mojego rozwoju.

Prawdopodobnie istnieje sposób na pobranie samego tagu, a nie tylko kopię zatwierdzonego tagu. Musiałem samemu oznaczyć to zobowiązanie. EDIT: Ach tak, znalazłem to teraz.

git fetch gitserver Fix_110:Fix_110

Gdzie widzisz dwukropek, to jest nazwa-zdalna: nazwa-lokalna i tutaj są to nazwy znaczników. Działa to bez komplikowania działającego drzewa itp. Wydaje się, że kopiuje on rzeczy z pilota na lokalny komputer, więc masz własną kopię.

git fetch gitserver --dry-run Fix_110:Fix_110

z dodaną opcją --dry-run pozwala sprawdzić, co zrobi polecenie, jeśli chcesz zweryfikować, co chcesz. Więc myślę, że to proste

git fetch gitserver remotetag:localtag

to jest prawdziwa odpowiedź.

=

Oddzielna notka o tagach ... Kiedy zaczynam coś nowego, zazwyczaj taguje puste repozytorium po git init, ponieważ

git rebase -i XXXXX 

wymaga zatwierdzenia, a pojawia się pytanie "w jaki sposób zmieniasz zmianę, która obejmuje twoją pierwszą zmianę oprogramowania?" Więc kiedy zaczynam pracę, robię

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

tj. utworzyć commit przed moją pierwszą prawdziwą zmianą, a następnie użyć

git rebase -i EMPTY 

jeśli chcę dokonać ponownej oceny całej mojej pracy, w tym pierwsza zmiana.


13
2017-12-11 17:28