Корень проблемы здесь состоит в том, что теги не имеют «пространства имен удаленных тегов», как это делают ветви.
При запуске git fetch
он обращается к удаленному устройству и передает ссылки в соответствии с линией (линиями) git config --get-all remote.name.fetch
. Обычно существует только один:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Таким образом, git fetch
приносит более refs/heads/master
но устанавливает его как refs/remotes/origin/master
.
Git всегда знает, что посмотреть в пространстве имен remotes/
«удаленные ветви».
При запуске git fetch --tags
, это добавляет:
refs/tags/*:refs/tags/*
как refspec (а также обходит remote.origin.fetch
часть), но он приближает всех тегов в (одинарный) refs/tags/
пространстве имен. Другими словами, пульт не является частью имени; вы и удаленный все используете одно глобальное пространство имен тегов.
Вы можете настроить репозиторий по-другому, добавив дополнительную строку:
git config --add remote.origin.fetch '+refs/tags/*:refs/rtags/origin/*'
Это создает новое локальное справочник пространство имен, refs/rtags/
. Так как вы поместите имя удаленного в качестве записи верхнего уровня под rtags
, вы можете настроить другое суб-пространство для другого пульта ДУ:
git config --add remote.rmt2.fetch '+refs/tags/*:refs/rtags/rmt2/*'
Теперь при запуске git fetch origin
это принесет теги происхождения в в качестве rtags/origin/
и git fetch rmt2
приведут теги rmt2 в rtags/rmt2/
.
Git делает не знать о rtags
(мы только что сделали это здесь!), Так что вы должны относиться к ним, как rtags/origin/foo
и т.д., или даже refs/rtags/origin/foo
в некоторых (редких) случаях.
(Опустим +
предотвратить силовое обновление тегов. Это как правило, не должно произойти пользователи не должны перемещать теги из одного SHA-1 к другому, но +
в fetch
линии означает, что «если они изменив его, возьмем новый ». Поскольку вы теперь вставляете их в пространство« удаленных тегов », я предполагаю, что вы, вероятно, хотите, чтобы они принудительно обновляли имена удаленных филиалов. Обратите внимание, что они также будут автоматически обрезаны, как и удаленные ветви, если вы запустите git fetch -p
или git remote prune
. Это не зависит от +
.)
+1 отличное объяснение! Я предполагаю, что это означает, что если у вас есть аналогичные теги для нескольких пультов, настройка тегов локально имеет приоритет при запросе списка тегов с использованием 'git tag -l'. – miqid
Да, поскольку в нем отсутствует '+', авто-refspec для 'git fetch -tags' не будет перезаписывать тег, который у вас уже есть. (Было бы плохо, если бы это было!) – torek
Отличное объяснение еще раз @torek. –