Завантажте певний тег за допомогою Git


1941

Я намагаюся зрозуміти, як я можу завантажити певний тег сховища Git - це одна версія за поточною версією.

Я бачив, що на веб-сторінці git був тег для попередньої версії з назвою об'єкта чимось довгим шістнадцятковим номером.

Але назва версії "Tagged release 1.1.5 " відповідно до сайту.

Я спробував таку команду, як ця (зі зміненими іменами):

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

І я щось отримав - каталог, купу підкаталогів тощо.

Якщо це все сховище, як я можу отримати версію, яку шукаю? Якщо ні, як я завантажую саме цю версію?


11
Я розвиваюсь на зовсім іншому репо, ніж виробництво, тому моє виробництво не знало жодних тегів, коли я намагався використовувати git checkout. Рішенням було використання "git pull --tags", а потім використання git checkout.
Enterprise Architect

11
"git fetch --tags" теж працює
Джон Ерк

16
Щоб уникнути клонування всього сховища та переходу на тег, ви можете безпосередньо зробити clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Це спрацює, лише якщо у вас немає філії з такою ж назвою курсу (залежно від вашої методології, це може ніколи не трапитися).
RedGlyph

3
@ Reded Glyph Дякую, я спробую це. Ще ми можемо зробити так. git checkout -b new-branch tag-name. Тепер клонуйте свою нову філію. Коли ми хочемо, ми можемо видалити нову гілку.
kalidasan

Відповіді:


2871
$ git clone

дасть вам весь сховище.

Після клонування ви можете перелічити теги, $ git tag -lа потім перевірити певний тег:

$ git checkout tags/<tag_name>

Ще краще, оформити замовлення та створити гілку (інакше ви будете на гілці, названій за номером редакції тегу):

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

15
Так. git в цьому відношенні відрізняється від підриву. Тег svn в основному копіює файли в нову папку, тому ви можете перевірити svn певний пакет файлів, тоді як теги git - просто вказівки на конкретні редакції.
дбр

5
Що робити, якщо у вас є гілка та тег із однаковою назвою? Якщо ви просто скажете "git checkout <ім'я>", він говорить "попередження: перейменувати" <ім'я> "неоднозначно. Переключився на гілку" <ім'я> "" - як вам сказати, щоб перейти до тегу?
MatrixFrog

54
під час оформлення каси і, як згадував Дерек, репо переходить у стан "відстороненої голови". натомість додайте -bпрапор, що повідомляє git, щоб створити нову гілку та вкажіть назву гілки:git checkout <tag_name> -b <branch_name>
hellatan

22
@hellatan Це потрібно робити лише тоді, коли ви насправді хочете створити філію, але більшу частину часу ви, мабуть, не робите. Працюючи в "відірваній голові", вам це не зашкодить, і, ймовірно, саме те, що ви хочете, якщо ви просто хочете перевірити історію git.
machineghost

4
У версії git 1.8.3.5та новіших версіях, ви --branch <tag ref>повинні дозволяти завантажувати сховище, починаючи з вашого, <tag ref>як REPO HEAD; в поєднанні з --depth 1буде робити дрібну перевірку тегів. Див stackoverflow.com/a/21699307/1695680
ThorSummoner

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

Клонуємо репо і залиште вас на тезі, який вас цікавить.

Документація для 1.8.0 станів клонування git .

--branch також може приймати теги та від'єднувати HEAD на цьому комітеті в результуючому сховищі.


7
Це (принаймні зараз) працює для тегів, хоча ви опинитесь у відокремленому стані HEAD.
mxcl

72
FYI: Також уточнюйте, --depth 1щоб уникнути завантаження будь-яких поточних комісій.
Акумен

4
Це дійсно не працює з тегами. Тільки гілки. Редагувати: Схоже, це підтримуються лише новіші версії git.
lzap

Ми також можемо відредагувати .git / config (або якось налаштувати його), щоб зробити дрібний клон з двох або більше тегів, якщо це може знадобитися, оновити мілкий клон до повного клону тощо.
Сем Уоткінс,

Ви також можете вказати потрібну гілку разом із тегом. Як git clone --branch my_abc http://git.abc.net/git/abc.git -b qualityякість - це назва галузі, яку ми хочемо btw.
hazimdikenli

180

Для перевірки лише заданого тегу для розгортання я використовую, наприклад:

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

Здається, це найшвидший спосіб перевірити код з віддаленого сховища, якщо зацікавлений лише останній код замість повного сховища. Таким чином він нагадує команду 'svn co'.

Примітка. Згідно з посібником Git , передача --depthпрапора означає --single-branchза замовчуванням.

- поглиблення

Створіть неглибокий клон з усіченою історією до визначеної кількості комітетів. Implies --single-branch, якщо --no-one-гілка не дається для отримання історій біля кінчиків усіх гілок. Якщо ви хочете дрібно клонувати підмодулі, також пропустіть - низькі субмодулі.


10
не можу повірити, що це так складно. здогадуйтесь, ніхто не очікує, що їх код буде використаний іншими.
Бен

9
@Ben, це насправді найпростіше рішення (потрібна одна команда)
Еліран Малька

3
@Ben чому це складно? Це спеціальна скринька з кількома функціями, яку ви хочете зробити інакше, ніж за замовчуванням. Звичайно, це потрібно вказати. Нормальним рішенням було б оформити всю репо в розподілених vcs.
erikbwork

9
@Ben має рацію. git є складним аф і був написаний ЛІНУМИ назад Лінусом, і він єдиний, хто "по-справжньому" розуміє, як це працює. xkcd.com/1597
RyanNerd

11
--depth nмається на увазі --single-branch. Вам не потрібно обоє.
Ніяз

98

Я не фахівець з git, але думаю, що це має працювати:

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

АБО

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

Друга варіація встановлює нову гілку на основі тегу, яка дозволяє уникнути "відокремленої HEAD". (посібник з перевірки git)

Кожна git repo містить всю історію версій, тому клонування репо дозволяє отримати доступ до останньої версії, а також до всього, що було раніше, включаючи тег, який ви шукаєте.


4
Дякую. Мені потрібно було скористатися git checkout -b b1.5.0 v1.5.0під час перевірки версії у відділенні "gh-pages", щоб успішно перейти на сторінки Github. Ця історія, яку я написав, може допомогти іншим: гілка / тег / підмодулі ... gist.github.com/1064750
Кріс Якоб

4
Я не думаю , що це абсолютно точно (наприклад , для вставки в термінал) , так як ти повинен cdв abc/першу , перш ніж ви можете оформити філія
Стівен Лу

@StevenLu Ви, звичайно, правильні. Я збирався робити концепції, а не вирізати і вставляти, але це може бути максимально точним. Я додав cd.
grossvogel

81

Ви можете скористатися архівом git, щоб завантажити кульку гудрону для заданого тегу або виконувати ідентифікатор:

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

Ви також можете експортувати zip-архів тегу.

  1. Теги списку:

    git tag
    
    0.0.1
    0.1.0
    
  2. Експорт тегу:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. Примітки:

    • Не потрібно вказувати формат. Він буде обраний за назвою вихідного файла.
    • Визначення префікса призведе до експорту коду до каталогу (якщо ви додаєте косу рису).

3
Ця команда не працює з подмодулей см stackoverflow.com/questions/1591387 / ...
Zitrax

3
Але архів git також видаляє контроль версій, тому ви не можете просто зробити ще одну перевірку git, щоб оновити до наступного тегу.
idbrii

9
Так, ви втрачаєте контроль над версією, але час збереження архіву git порівняно з клоном git - АБСОЛЮТНО НЕВЕРЕДОВИЙ! +1
MarcH

Це ТАКЕ ЗАКРІТНЕННЯ до того, що я хочу, за винятком того, що git archiveпросити мене пароль, коли все, що я хочу зробити, - це завантажити з публічного репо. Як я можу змусити його використовувати http замість ssh?
robru

1
Це не вдається із помилками fatal: Operation not supported by protocol.та Unexpected end of command stream. Крім того, він також може повернути fatal: The remote end hung up unexpectedlyпомилку.
Акумен

52

Використовуйте --single-branchперемикач (доступний з Git 1.7.10) . Синтаксис:

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

Наприклад:

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

Перевага: Git отримає об'єкти та (потрібно) вирішити дельти лише для вказаної гілки / тегу - перевіряючи рівно стільки ж файлів! Залежно від джерела сховища, це заощадить багато дискового простору. (Плюс це буде набагато швидше.)


3
Хто бідував / не відповідав на цю відповідь: Будь ласка, також залиште коментар із коротким поясненням щодо протиправника. (Просто запитую, бо я трохи розгублений. Тому що, афаік, це найкраще рішення для даної проблеми. І якщо ти не вважаєш цього, я хотів би знати чому.) Велике спасибі.
eyecatchUp

5
Не намагайтеся занадто сильно розуміти погляди. Ваша відповідь дуже хороша, їхні голоси, ймовірно, необгрунтовані .. це життя на SOF ..
javadba

не працював на git версії 2.22.0.Windows.1
Mahesh

29

спочатку заберіть усі теги на цьому конкретному пульті

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

або просто просто введіть

git fetch <remote>

Потім перевірте наявність тегів

git tag -l

потім перейдіть до цього конкретного тегу за допомогою команди нижче

git checkout tags/<tag_name>

Сподіваюся, що це допоможе вам!


навіщо використовувати ´git тег-я´ він повинен бути таким же, як ´git тег´?
serup

1
@serup; git tagдодасть тег, git tag -lперераховуючи доступні теги
Joost Döbken

18

Якщо ваші теги можна сортувати за допомогою команди linux sort, використовуйте це:

git tag | sort -n | tail -1

напр. якщо git tagповертається:

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

git tag | sort -n | tail -1 виведе:

v1.0.5

git tag | sort -n | tail -2 | head -1 виведе:

v1.0.4

(тому що ви попросили другий останній тег)

щоб перевірити тег, спочатку клонуйте репо, а потім введіть:

git checkout v1.0.4

.. або будь-який тег вам потрібен.


25
Доки ви не досягнете версії 1.0.10, а потім трапляться погані речі :)
Лоран Грегоар

10
Щоб ваші теги були сортовані хронологічно:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

Один лайнер для автоматичної перевірки останньої версії,git checkout `git tag | sort -n | tail -1`
weiji14

Ви можете використовувати sort -Vзамість цього sort -n. Перші правильно обробляють версії, які не обов'язково є числовими, наприклад, "1.2.3". Він також розуміє, що "0.4.10" йде після "0.4.1", а не після "0.4.2", що -nдасть вам.
Матеуш Місіорні

16

Я перевірив документацію git checkout , виявив одну цікаву річ:

git checkout -b <new_branch_name> <start_point>, де <start_point> - ім'я коміту, з якого запустити нову гілку; За замовчуванням HEAD

Таким чином, ми можемо згадати ім'я тега (як тег - це не що інше, як ім'я комітету) як, скажімо:

>> git checkout -b 1.0.2_branch 1.0.2
пізніше змініть деякі файли
>> git push --tags

PS: У Git ви не можете оновити тег безпосередньо (оскільки тег - це лише мітка для комісії), вам потрібно оформити той самий тег, що і гілка, а потім скористатися ним, а потім створити окремий тег.


1
Або якщо ви не сподіваєтесь внести якісь зміни, і ви просто хочете подивитися, як виглядав код у цьому тегу, ви можете просто перевірити тег, не створюючи гілки. Ви отримаєте текст, в якому пояснюється, що ви перебуваєте в стані "відірваної голови", і ви завжди можете створити гілку пізніше, якщо захочете.
MatrixFrog

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

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

Я щойно це зробив. Спочатку я переконався, що знаю правопис назви тегів.

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

Це дало мені список тегів на моєму сервісі git на вибір. Оригінальний плакат уже знав назву його тегу, тому цей крок потрібен не всім. Вихід виглядав так, хоча реальний список був довшим.

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

Я вибрав тег, який я хотів, і здобув це, і нічого більше, як слід.

git fetch gitserver Fix_110

Потім я позначив це на своїй локальній машині, давши моє тегу те саме ім'я.

git tag Fix_110 FETCH_HEAD

Я не хотів клонувати віддалене сховище, як пропонували інші люди, оскільки проект, над яким я працюю, великий, і я хочу розвиватися в хорошому чистому середовищі. Я вважаю, що це ближче до оригінальних запитань "Я намагаюся розібратися, як завантажувати ОСОБЛИВНУ ТАК", ніж рішення, яке передбачає клонування всього сховища. Я не бачу, чому хтось повинен мати копію вихідного коду Windows NT та Windows 8.1, якщо вони хочуть переглянути вихідний код DOS 0.1 (наприклад).

Я також не хотів використовувати CHECKOUT так, як пропонують інші. У мене була перевірена філія, і я не хотіла на це впливати. Мій намір був отримати програмне забезпечення, яке я хотів, щоб я міг щось вибрати і додати це до своєї розробки.

Можливо, існує спосіб отримати тег сам, а не просто копія комітету, який позначений тегом. Мені довелося мітити те, що я отримав. РЕДАКТ: Ага так, я знайшов це зараз.

git fetch gitserver Fix_110:Fix_110

Там, де ви бачите двокрапку, це віддалене ім’я: local-name і ось вони - імена тегів. Це запускається, не засмучуючи робоче дерево тощо. Це, здається, копіює речі з віддаленого пристрою на локальну машину, щоб у вас була своя копія.

git fetch gitserver --dry-run Fix_110:Fix_110

додана опція --dry-run дозволить вам ознайомитись з тим, що зробила б команда, якщо ви хочете перевірити її те, що ви хочете. Тож я здогадуюсь простого

git fetch gitserver remotetag:localtag

справжня відповідь.

=

Окреме зауваження про теги ... Коли я запускаю щось нове, я зазвичай тегую порожнє сховище після git init, оскільки

git rebase -i XXXXX 

вимагає виконання зобов’язань, і виникає питання "як ви відновите зміни, які включають ваші перші зміни програмного забезпечення?" Тож коли я починаю працювати, я роблю

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

тобто створити комісію перед моєю першою реальною зміною, а потім пізніше використовувати

git rebase -i EMPTY 

якщо я хочу відновити всю свою роботу, включаючи першу зміну .


8

Опрацьовуючи відповідь Пітера Джонсона, я створив собі хороший псевдонім:

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

він же "останній тег git checkout".

Це спирається на версію роду GNU, яка належним чином вирішує ситуації, подібні до вказаного lOranger:

v1.0.1
...
v1.0.9
v1.0.10

Якщо ви перебуваєте на mac, brew install coreutilsа потім зателефонуйте на gsort.



5

Перевірка тегів

Якщо ви хочете переглянути версії файлів, на які вказує тег, ви можете зробити git checkout, хоча це переводить ваш сховище у стан «відокремленої HEAD», що має деякі негативні побічні ефекти:

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

У стані "відокремлена HEAD", якщо ви внесете зміни, а потім створите команду, тег залишиться таким самим, але ваш новий комітет не буде належати до жодної гілки та буде недоступним, за винятком точного хеша фіксації. Таким чином, якщо вам потрібно внести зміни - скажімо, виправляєте помилку на старій версії, наприклад, - ви, як правило, захочете створити гілку:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Якщо ви зробите це і зробите зобов’язання, ваша версія2 буде дещо іншою, ніж ваш тег v2.0.0, оскільки вона рухатиметься вперед разом із вашими новими змінами, тому будьте обережні.


4

Я роблю це через API github:

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \

1
Це працює для гілок і тегів, але не головний майстер, якому потрібен тег, створений проти нього. Досить елегантний спосіб отримати версію мінімального розміру.
J0hnG4lt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.