Получить один тег из удаленного репозитория

Эта команда извлекает все теги:

git fetch origin --tags

Эта команда извлекает определенный тег:

git fetch origin refs/tags/1.0.0

Но это не позволяет мне делать:

git checkout tags/2.3.18

Как я могу получить один тег, а затем выполнить проверку?

Ответ 1

git fetch origin refs/tags/1.0.0

Это терпит неудачу, потому что он не пишет локальную ссылку: он получает удаленные refs/tags/1.0.0 и любые теги (объекты), коммиты и т.д., Необходимые для перехода к нему; он отбрасывает их в FETCH_HEAD (поскольку всегда выполняются команды git fetch); и... что это. Он никогда не создает ссылки refs/tags/1.0.0 в вашем репозитории, хотя у него есть все необходимое для этого.

Чтобы создать такой тег, если он еще не существует:

git fetch origin refs/tags/1.0.0:refs/tags/1.0.0

Имя справа от двоеточия - это имя, которое Git будет использовать в вашем репозитории. Вы можете включить этот тег в ветку с именем wacky, например, назвав ее refs/heads/wacky. (Нет причин для этого. Я описываю это только для иллюстрации.)

Это принудительная выборка, поэтому, если у вас уже есть refs/tags/1.0.0, ваш Git откажется обновить вашу ссылку. Если вы хотите перезаписать любой существующий тег 1.0.0, используйте:

git fetch origin +refs/tags/1.0.0:refs/tags/1.0.0

Если вы хотите получить все теги, с или без перезаписи:

git fetch origin 'refs/tags/*:refs/tags/*'

с или без знака плюс. (Примечание: отметки кавычки предназначены только для защиты * от вашей оболочки. Знак "плюс" может находиться внутри или вне кавычек. Фактически сами кавычки могут перемещаться в любом месте, пока они окружают все звездочки или другие метасимволы оболочки:

refs/tags/'*:refs/tags/*'

или вместо этого вы можете использовать обратную косую черту:

refs/tags/\*:refs/tags/\*

Во всех случаях мы просто защищаем чувствительную звездочку от оболочки, "звездочки являются вкусными, пусть их есть").

Ответ 2

Когда вы указываете явные ссылки на git fetch, вам нужно либо предоставить сопоставление в вашем refspec, либо сделать то, что вы хотите, с FETCH_HEAD идентификатором, записанным в FETCH_HEAD.

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

git fetch origin v2.3.18
git tag v2.3.18 FETCH_HEAD    # ← git tag !$ FE<TAB>

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

Ответ 3

Я прочитал все ответы, но там пока не упоминается один синтаксический сахар. Если вам нужно выбрать только один тег в качестве тега (чтобы оформить заказ позже), вы можете написать, например, для refs/tags/2.3.18:

git fetch origin tag 2.3.18 --no-tags

Это сокращение для уже упомянутых:

git fetch origin refs/tags/2.3.18:refs/tags/2.3.18 --no-tags

Конечно, вы не можете использовать --no-tags, если вам нужны другие теги (в соответствии с поведением по умолчанию) или если вы уже явно указали --no-tag в команде clone или в параметре конфигурации tagOpt (man git-clone).

git fetch origin tag 2.3.18