Git: различать локальные и удаленные теги

Если в удаленном репозитории есть теги, я обычно получаю их автоматически при нажатии. Когда я удалю созданный локальный тег (git tag -d <tag-name>) и вытащу, удаленный тег будет воссоздан. Я могу удалить удаленные ветки/теги (git push <remote-branch/tag-name>:<branch/tag-name>), но как я могу обнаружить, что локальный тег был создан, извлекая удаленный тег?

Ответ 1

Если вас раздражают эти воссозданные теги при запуске git pull, вы отключите выборку тегов по умолчанию с помощью remote. < remote-name > . tagopt. например если пульт origin, то вы можете сделать:

git config remote.origin.tagopt --no-tags

Обновление: чтобы ответить на ваш комментарий, причина, по которой я предлагаю это, заключается в том, что нет очевидного способа рассказать разницу между тегом, который был создан локально, и те, которые были получены с удаленного. Для тегов также нет reflog. Итак, мое предложение состоит в том, чтобы отключить автоматическую выборку тегов - вы можете сами их забрать в другое пространство имен. Например, вы можете сделать:

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

... и, возможно, создать для него псевдоним. Затем, когда вы хотите получить теги, они будут называться, например, refs/tags/origin/tag1 вместо refs/tags/tag1.


Если вы хотите, чтобы это произошло автоматически, вы можете изменить свой .git/config, чтобы перечислить несколько refspec для извлечения, например:

 [remote "origin"]
      url = [email protected]:whatever.git
      fetch = +refs/heads/*:refs/remotes/origin/*
      fetch = +refs/tags/*:refs/tags/origin/*

... который предлагается в Pro Git.

Ответ 2

тег не является "локальным" или "remote": он связан с фиксацией, которая может быть частью нескольких ветвей, в том числе и в пространстве имен удаленных объектов.

Получить тег SHA1 коммита, на который ссылается тег

git show -s 'TAG_NAME^{commit}' --format='%H'

и выполните:

git branch -a --contains SHA1

Если вы видите

 remotes/aRemoteRepoName/aBranch

вы знаете, что тег ссылается на фиксацию, полученную вами из удаленного репо.

Как Chris упоминает:

git branch -a --contains TAGNAME

будет разыменовывать тег и дает ответ за один раз.