Питання Завантажте певний тег з Git


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

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

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

Я намагався виконати таку команду (з іменами змінено):

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

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

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


1661
2018-04-27 01:15


походження


Я розвиваюся на зовсім іншому репо, а потім на виробництво, тому моє виробництво не знало ніяких міток, коли я намагався використовувати git checkout. Рішенням було використовувати "git pull --tags", а потім скористатися git checkout. - Enterprise Architect
"git fetch --tags" теж працює - John Erck
Щоб уникнути клонування всього сховища, після переходу на тег, ви можете безпосередньо зробити це clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Це буде працювати, лише якщо у вас немає філії з таким самим іменем курсу (залежно від вашої методології це ніколи не відбудеться). - RedGlyph
@RedGlyph Дякую, я спробую це. Інакше ми можемо це зробити. git checkout -b new-branch tag-name. Тепер клонувати свою нову гілку. Коли хочемо, ми можемо видалити нове відділення. - kalidasan


Відповіді:


$ git clone

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

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

$ git checkout tags/<tag_name>

Ще краще перевірити і створити гілку (інакше ви опинитеся в галузі за назвою номера тегу ревізії):

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

2559
2018-04-27 01:53



Так. Гіт відрізняється від підрив у цьому відношенні. Тег svn в основному копіює файли до нової папки, так що ви можете вибрати svn певну кількість файлів, тоді як теги git - це просто вказівки на конкретні зміни. - dbr
Що робити, якщо у вас є філія та тег, що мають одне ім'я? Якщо ви просто скажете "git checkout <name>" це говорить "warning: refname" <name> "є неоднозначним. Переключено на гілку" <ім'я> "- як вам сказати, щоб перейти на тег замість нього? - MatrixFrog
Щоб уникнути неоднозначності, запустіть MatrixFrog git checkout tags/<name>. В іншому випадку, Гіт вважає, що ви мали намір відновити гілку <name>. - Derek Mahar
під час оформлення замовлення і, як згадував Дерек, репо переходить у стан "окремо голови". замість цього додайте -b flag tell git, щоб створити нову гілку і вказати назву гілки: git checkout <tag_name> -b <branch_name> - hellatan
@hellatan Це слід робити лише тоді, коли ви насправді хочете створити гілку, але більшу частину часу ви, напевно, не робите. Запуск у режимі "окремо голова" не зашкодить вам, ймовірно, саме те, що ви хочете, якщо ви просто хочете перевірити деяку історію git. - machineghost


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

Буде клонувати репо та залишити вас на темі, що вас цікавить.

Документація для 1.8.0 гіт-клон держави.

- розділ також може приймати теги та від'єднувати HEAD при цьому commit у отриманому репозиторії.


268
2018-06-14 09:33



Це робить (принаймні, зараз) роботу з тегами, хоча ви опиняєтеся в окремому стані HEAD. - mxcl
FYI: також вкажіть --depth 1 щоб уникнути завантаження будь-яких непростих зобов'язань. - A-B-B
Це дійсно так ні працювати з тегами. Тільки філії. Редагувати. Схоже, що підтримуються лише нові версії git. - lzap
Ми також можемо редагувати .git / config (або якось його налаштувати), щоб зробити неглибокий клон двох чи більше тегів, якщо це може знадобитися, оновити неглибокий клон до повного клону тощо. - Sam Watkins
це повинно бути прийнятою відповіддю, IMHO. - Sumi Straessle


Я не експерт 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

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

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


94
2018-04-27 01:54



Дякую. Мені потрібно було користуватися git checkout -b b1.5.0 v1.5.0 перевіряючи версію в гілці gh-сторінок, щоб успішно натиснути на Github Pages. Цей Gist I, який я написав, може допомогти іншим користувачам: branch / tag / submodules ... gist.github.com/1064750 - Chris Jacob
Я не думаю, що це повністю точне (наприклад, вставка в термінал), оскільки ви повинні cd в abc/ спочатку перед тим, як ви можете перевірити філію - Steven Lu
@StevenLu Ви, звичайно, правильні. Я йшов за понять, а не розрізав і встав, але він також може бути максимально точним. Я додав cd. - grossvogel


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

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

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


85
2017-07-28 02:35



Не можу повірити, що це складно. здогадатися, що ніхто не очікує, що їх коди будуть використовуватися іншими. - Ben
@Ben, це насправді є самим простим рішенням (потрібна одна команда) - Eliran Malka
@Бен, чому це складно? Це спеціальний інструмент для входу з декількома функціями, які ви хочете робити по-іншому, за замовчуванням. Звичайно, це потрібно вказати. Звичайним рішенням було б перевірити весь репо в a поширюється VCS - erikbwork
@ Бен правильно. Гіт складний, і він був написаний ЛЕВОМ років тому Лінусом, і він єдиний, хто "справді" розуміє, як це працює. xkcd.com/1597 - RyanNerd


Ви можете скористатись git archive, щоб завантажити кульовий бал для даного тегу або commit id:

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

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

  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. Примітки:

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

71
2017-12-09 21:46



Ця команда не працює з підмодулями, див stackoverflow.com/questions/1591387/... - Zitrax
Але git-архів також видаляє елемент керування версіями, тому ви не можете просто зробити іншу перевірку git для переходу до наступного тегу. - idbrii
Так, ви втрачаєте контроль над версією, але час зберігання архіву git в порівнянні з клоном git абсолютно не вірний! +1 - MarcH
Це так закриває те, що я хочу, крім цього git archive запитує мені пароль, коли все, що я хочу зробити, це завантажити з публічного репо. Як я можу використати HTTP замість SSH? - robru
Це не вдається з fatal: Operation not supported by protocol. і Unexpected end of command stream помилки Крім того, він також може повернути fatal: The remote end hung up unexpectedly помилка - A-B-B


Використовувати --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 отримає об'єкти та (потрібно) вирішувати дельти для вказаної гілки / теги - при перевірці точно такої ж кількості файлів! Залежно від сховища джерела це заощадить вам багато місця на диску. (Крім того, це буде набагато швидше.)


40
2018-06-25 06:28



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


Спочатку завантажте всі теги в цей конкретний пульт

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

або просто просто напишіть

git fetch <remote>

Потім перевірте доступні теги

git tag -l

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

git checkout tags/<tag_name>

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


21
2017-09-10 18:57





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

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

Отже, ми можемо згадати ім'я тегу (оскільки тег - це не що інше, як назва комісії), як, скажімо:

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

П.С .: У Gіt ви не можете оновити тег безпосередньо (оскільки тег є лише міткою для фіксації), ви повинні здійснити перевірку того ж тегу, що і гілка, а потім зобов'язати його, а потім створити окремий тег.


14
2018-04-26 14:39



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


Якщо ваші теги можна сортувати за допомогою 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

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


14
2018-05-12 12:23



Доки ви не досягнете v1.0.10, а потім стаються погані речі :) - Laurent Grégoire
Щоб ваші теги були сортовані в хронологічному порядку: 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 дасть тобі. - Mateusz Misiorny


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

Я не хотів клонувати віддалений сховище, як запропонували інші, оскільки проект, над яким я працюю, є великим, і я хочу розвинутись у приємному чистому середовищі. Я відчуваю, що це ближче до початкових питань "Я намагаюся з'ясувати, як завантажити ПЕВНИЙ TAG", ніж рішення, яке передбачає клонування всього сховища. Я не розумію, чому кожен повинен мати копію вихідного коду Windows NT та Windows 8.1, якщо вони хочуть переглянути вихідний код DOS 0.1 (наприклад).

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

Існує, ймовірно, спосіб завантажити сам тег, а не лише копію тієї копії, яку було позначено. Я повинен був позначити причетні зобов'язання себе. РЕДАГУВАТИ: Ага, я знайшов це зараз.

git fetch gitserver Fix_110:Fix_110

Де ви бачите двокрапку, це віддалене ім'я: місцева назва, і тут вони - імена тегів. Це запускається, не порушуючи робочого дерева тощо. Схоже, що копіювати матеріали з пульта ДУ на локальну машину, щоб у вас була власна копія.

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 

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


13
2017-12-11 17:28





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

alias gcolt="git checkout \`git tag | sort -V | tail -1\`"

як і "git checkout latest tag".

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

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

Якщо ви знаходитесь на Mac, brew install coreutils а потім зателефонувати gsort.


7
2018-03-15 16:41