2013-12-03 2 views
2

Я использую read-tree, чтобы преодолеть голое репо, не могу использовать проблему подмодулей при нажатии на сервер для развертывания, но теперь я немного застреваю там, где два репозитория, с которыми я работаю, имеют тегированные номера версий. Мне нужен какой-то древовидный способ ссылаться на тег, включая удаленное имя, но я не вижу ничего очевидного. Что-то вроде:Есть ли способ различать теги одного и того же имени, полученные от разных пультов?

git read-tree --prefix=api/framework/ -u framework/1.6.5 

Где каркас - один из пультов. Но только это работает:

git read-tree --prefix=api/framework/ -u 1.6.5 

Однако другой пульт моей иметь тот же тег ... и мерзавец тегов перечислены все теги в одном списке

Любые идеи будут оценены.

ответ

5

Корень проблемы здесь состоит в том, что теги не имеют «пространства имен удаленных тегов», как это делают ветви.

При запуске 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. Это не зависит от +.)

+0

+1 отличное объяснение! Я предполагаю, что это означает, что если у вас есть аналогичные теги для нескольких пультов, настройка тегов локально имеет приоритет при запросе списка тегов с использованием 'git tag -l'. – miqid

+0

Да, поскольку в нем отсутствует '+', авто-refspec для 'git fetch -tags' не будет перезаписывать тег, который у вас уже есть. (Было бы плохо, если бы это было!) – torek

+0

Отличное объяснение еще раз @torek. –

0

Я только что нашел частичный ответ, хотя это не совсем так хорошо, как со ссылкой на сам тег:

git ls-remote --tags framework 

Затем увидеть ша тега вы хотите, и использовать его. С удовольствием узнаем о лучшем пути.

Смежные вопросы