Загрузите определенный тег с помощью Git

1521

Я пытаюсь выяснить, как я могу загрузить конкретный тег репозитория 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.
  • 11
    "git fetch --tags" тоже работает
Показать ещё 2 комментария
Теги:
git-clone
git-tag

15 ответов

2389
Лучший ответ
$ git clone

предоставит вам весь репозиторий.

После клона вы можете перечислить теги $ git tag -l, а затем проверить определенный тег:

$ git checkout tags/<tag_name>

Еще лучше, проверьте и создайте ветку (иначе вы будете на ветке с именем после номера версии тега):

$ git checkout tags/<tag_name> -b <branch_name>
  • 14
    Ага. Git отличается от Subversion в этом отношении. Тег svn в основном копирует файлы в новую папку, так что вы можете svn извлекать определенную группу файлов, тогда как теги git просто указывают на определенные ревизии.
  • 0
    @Renato после git checkout <tag_name> может работать над тем же и фиксировать его, просто рассматривая <tag_name> как <branch_name> ?? Я думал, что <tag_name> дается для специального коммита (как релиза), но трактует ли это как ветку путаницу и наоборот?
Показать ещё 16 комментариев
187
git clone --branch my_abc http://git.abc.net/git/abc.git

Будет клонировать репо и оставить вас на интересующем вас теге.

Документация для 1.8.5.2 состояний git clone.

- ветвь также может принимать теги и отделяет HEAD от этой фиксации в результирующем репозитории.

  • 6
    Это работает (по крайней мере сейчас) для тегов, хотя в конечном итоге вы находитесь в отключенном состоянии HEAD.
  • 55
    К вашему сведению: также укажите --depth 1 чтобы не загружать любые текущие коммиты.
Показать ещё 3 комментария
87

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

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

  • 4
    Спасибо. Мне нужно было использовать git checkout -b b1.5.0 v1.5.0 при проверке версии в ветке 'gh-pages', чтобы успешно перейти на Github Pages. Этот Gist, который я написал, может помочь другим: разветвлять / тегить / подмодули ... gist.github.com/1064750
  • 4
    Я не думаю, что это абсолютно точно (например, для вставки в терминал), так как сначала вы должны cd в abc/ cd прежде чем сможете оформить ветку
Показать ещё 1 комментарий
67

Вы можете использовать архив git для загрузки tar-шара для данного тега или фиксации id:

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

Вы также можете экспортировать zip-архив тега.

  • Список тегов:

    git tag
    
    0.0.1
    0.1.0
    
  • Экспортировать тег:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  • Примечание:

    • Вам не нужно указывать формат. Он будет подхвачен именем выходного файла.
    • Указание префикса приведет к тому, что ваш код экспортируется в каталог (если вы добавляете конечную косую черту).
  • 3
    Эта команда не работает с подмодулями, см. Stackoverflow.com/questions/1591387/…
  • 3
    Но архив git также удаляет управление версиями, поэтому вы не можете просто сделать еще одну проверку git, чтобы перейти к следующему тегу.
Показать ещё 5 комментариев
59

Для проверки только определенного тега для развертывания я использую например:

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

Кажется, это самый быстрый способ проверить код из удаленного репозитория, если у вас есть интерес только к самому последнему коду, а не к полному репозиторию. Таким образом, он напоминает команду svn co.

  • 8
    не могу поверить, что это сложно. думаю, никто не ожидает, что их код будет использоваться другими.
  • 9
    @Ben, это на самом деле самое простое решение (требуется одна команда)
Показать ещё 4 комментария
27

Используйте переключатель --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 будет получать объекты и (необходимо) разрешать дельта только для указанного ветки/тега - при проверке того же количества файлов! В зависимости от исходного репозитория это позволит вам сэкономить много места на диске. (Кроме того, это будет намного быстрее.)

  • 2
    Кто бы ни проголосовал против / отрицает этот ответ: Пожалуйста, также оставьте комментарий с кратким объяснением понижения. (Просто спрашиваю, потому что я немного смущен. Потому что, на самом деле, это лучшее решение для данной проблемы. И если вы так не думаете, я хотел бы знать, почему.) Большое спасибо.
  • 3
    Не пытайтесь понять слишком много отрицательных голосов ... ваш ответ очень хороший, их отрицательные оценки, скорее всего, необоснованны ... это жизнь на SOF ..
16

сначала выберите все теги в этом удаленном

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

или просто введите

git fetch <remote>

Затем проверьте доступные теги

git tag -l

затем переключитесь на этот тег, используя следующую команду

git checkout tags/<tag_name>

Надеюсь, это поможет вам!

  • 0
    зачем использовать тег git -l, он должен совпадать с тегом git?
13

Если ваши теги сортируются с помощью команды 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
    Пока вы не достигнете v1.0.10, и тогда плохие вещи случаются :)
  • 10
    Чтобы ваши теги были отсортированы в хронологическом порядке: git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Показать ещё 2 комментария
12

Я проверил git документацию по проверке, он обнаружил одну интересную вещь:

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
    Или, если вы не планируете вносить какие-либо изменения и хотите просто посмотреть, как выглядит код для этого тега, вы можете просто извлечь тег, не создавая ветку. Вы получите текст, объясняющий, что вы находитесь в состоянии «отсоединенная голова», и вы всегда можете создать ветку позже, если захотите.
11
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

Я не хотел клонировать удаленный репозиторий, как предлагали другие люди, поскольку проект, над которым я работаю, большой, и я хочу развиваться в чистой чистой среде. Я чувствую, что это ближе к оригинальным вопросам: "Я пытаюсь выяснить, как загрузить A PARTICULAR TAG", чем решение, предлагающее клонировать весь репозиторий. Я не понимаю, почему кто-то должен иметь копию исходного кода Windows NT и Windows 8.1, если они хотят посмотреть на исходный код DOS 0.1 (например).

Я также не хотел использовать CHECKOUT, как предложили другие. У меня была ветка, и я не хотел этого влиять. Мое намерение состояло в том, чтобы получить программное обеспечение, которое я хотел, чтобы я мог вишнево-выбрать что-то и добавить это в свою разработку.

Вероятно, есть способ извлечь сам тег, а не только копию фиксации, помеченной тегом. Я должен был пометить полученную фиксацию. EDIT: Ах да, я нашел его сейчас.

git fetch gitserver Fix_110:Fix_110

Если вы видите двоеточие, то есть имя-remote: 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 

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

6

Отключение ответа Питера Джонсона, я создал для себя небольшой псевдоним:

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

aka 'git последний тег checkout.

Это зависит от версии рода GNU, которая надлежащим образом обрабатывает ситуации, подобные указанному lOranger:

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

Если вы находитесь на mac, brew install coreutils и затем вызываете gsort вместо этого.

4

попробовать:

git clone -b <name_of_the_tag> <repository_url> <destination>
  • 0
    Если для хранилища существует несколько веток, то какая ветка будет клонирована?
2

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

Если вы хотите просмотреть версии файлов, на которые указывает тег, вы можете выполнить проверку git, хотя это помещает ваш репозиторий в состояние "отсоединенный 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", если вы вносите изменения, а затем создаете фиксацию, тег будет оставаться неизменным, но ваш новый фиксатор не будет принадлежать какой-либо ветке и будет недоступен, за исключением точного хэша commit. Таким образом, если вам нужно внести изменения, скажем, что вы исправляете ошибку в более старой версии, например, вы обычно захотите создать ветку:

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

Если вы сделаете это и сделаете фиксацию, ваша ветка version2 будет немного отличаться от вашего тега v2.0.0, так как она будет двигаться вперед с вашими новыми изменениями, поэтому будьте осторожны.

2

Я делаю это через 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
    Это работает для веток и тегов, но не для главы мастера, которому нужен тег, созданный против него. Имхо довольно элегантный способ получить версию минимального размера.
1

Клон с опцией -b также помогает: git clone https://git01.codeplex.com/aspnetwebstack.git -b v2.0

Следующая публикация использует вышеуказанный вариант для загрузки asp.net mvc: http://vijayt.com/Post/Setting-up-aspnet-mvc-for-debugging-in-your-system

Ещё вопросы

Сообщество Overcoder
Наверх
Меню