Загрузите определенный тег с помощью Git - PullRequest
1818 голосов
/ 27 апреля 2009

Я пытаюсь выяснить, как я могу загрузить определенный тег репозитория Git - это одна версия позади текущей версии.

На веб-странице git я увидел тег для предыдущей версии, в котором имя объекта было длинным шестнадцатеричным числом.

Но название версии "Tagged release 1.1.5" по сайту.

Я попробовал такую ​​команду (с измененными именами):

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

И я кое-что получил - каталог, куча подкаталогов и т. Д.

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

Ответы [ 14 ]

2751 голосов
/ 27 апреля 2009
$ git clone

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

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

$ git checkout tags/<tag_name>

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

$ git checkout tags/<tag_name> -b <branch_name>
356 голосов
/ 14 июня 2012
git clone --branch my_abc http://git.abc.net/git/abc.git

Клонирует репо и оставит вас на интересующем вас теге.

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

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

136 голосов
/ 28 июля 2015

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

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

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

Примечание: для руководства Git , пропуск флага --depth подразумевает --single-branch по умолчанию.

- глубина

Создать неглубокий клон с историей, усеченной до указанного количества коммитов. Подразумевает --single-branch, если --no-single-branch не дан для извлечения историй около кончиков всех ветвей. Если вы хотите поверхностно клонировать подмодули, также передайте --shallow-submodules.

96 голосов
/ 27 апреля 2009

Я не эксперт по git, но я думаю, что это должно работать:

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

OR

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

Второй вариант устанавливает новую ветвь на основе тега, которая позволяет вам избежать «отсоединенной ГОЛОВКИ». (инструкция git-checkout)

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

79 голосов
/ 10 декабря 2009

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

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. Примечания:

    • Вам не нужно указывать формат. Он будет выбран по имени выходного файла.
    • Указание префикса приведет к экспорту вашего кода в каталог (если вы добавите косую черту).
49 голосов
/ 25 июня 2015

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

27 голосов
/ 10 сентября 2015

сначала извлеките все теги на этом конкретном пульте

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

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

git fetch <remote>

Затем проверьте наличие тегов

git tag -l

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

git checkout tags/<tag_name>

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

16 голосов
/ 11 декабря 2014
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, как предлагали другие. Я проверил ветку и не хотел влиять на это. Мое намерение состояло в том, чтобы получить программное обеспечение, которое я хотел, чтобы я мог что-то выбрать и добавить это в свою разработку.

Вероятно, есть способ извлечь сам тег, а не просто копию коммита, который был помечен. Мне пришлось пометить извлеченный коммит сам. РЕДАКТИРОВАТЬ: Ах да, я нашел это сейчас.

git fetch gitserver Fix_110:Fix_110

Там, где вы видите двоеточие, это remote-name: 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 

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

16 голосов
/ 12 мая 2010

Если ваши теги можно сортировать с помощью команды 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

.. или любой тэг, который вам нужен.

16 голосов
/ 26 апреля 2010

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

git checkout -b <начальная точка> где - это имя коммита с чего начать новую ветку; По умолчанию HEAD

Таким образом, мы можем упомянуть имя тега (так как тег - это не что иное, как имя коммита) как, скажем:

>> git checkout -b 1.0.2_branch 1.0.2
позже, измените некоторые файлы
>> git push --tags

PS: В Git вы не можете обновить тег напрямую (так как тег - это просто метка для коммита), вам нужно извлечь тот же тег в виде ветви, а затем зафиксировать его и затем создать отдельный тег.

...