Git tag, почему этот дублирующий тег в пультах - PullRequest
21 голосов
/ 18 марта 2011
30bd19ef190cf664356c715b56044ce739f07468        refs/tags/Prod_Release_2.3
4ae15ee04c2c41bfc7945e66f4effc746d52baec        refs/tags/Prod_Release_2.3^{}

Выше приведен вывод git ls-remote --tags списка тегов в моем централизованном репозитории (голый).

Для Prod_Release_2.3 я ожидаю только 1 тег, я понятия не имею, откуда взялся этот Prod_Release_2.3^{}.

В centralrepo1 идентификатор Prod_Release_2.3 совпадает с идентификатором centralrepo2 для Prod_Release_2.3 ^ {} и наоборот.

В моем локальном хранилище есть только один тег Prod_Release_2.3.

Что-то не так? Или это по замыслу?

Центральный репозиторий размещен в Ubuntu, и я использую msysgit на своем компьютере разработчика.

Ответы [ 2 ]

29 голосов
/ 18 марта 2011

В Git есть два типа тегов: «облегченные» и «аннотированные».

Легкие теги - это просто ссылки в пространстве имен refs/tags/, которые указывают на какой-то другой объект.Они создаются с использованием git tag <tagname> [object] без -a, -m, -F, -s или -u.

Аннотированные теги на самом деле являются отдельным видом объекта Git (a тег объекта ), указывающий на какой-либо другой объект.Объекты тегов хранят информацию о коммитере, информацию об авторе, сообщение (аналогично объектам фиксации ) и указывают на любой другой объект (отличающийся от объектов фиксации, в котором коммиты указывают ровно на один объект дерева и ноль или более других коммитов).

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

Обычно оба типа тегов указывают на коммиты, но они могут указывать на любой тип объекта Git (тег, коммит, дерево или капля).Хранилище git.git имеет refs/tags/junio-gpg-pub, которое указывает на большой двоичный объект, содержащий открытый ключ GPG сопровождающего.Кроме того, torvalds/linux-2.6.git имеет refs/tags/v2.6.11, который указывает на дерево.Хотя теги, указывающие на объекты без фиксации, технически разрешены, они могут сломать или перепутать некоторые инструменты, поэтому по возможности их следует избегать.


Суффикс синтаксиса ^{} (описан в gitrevisions (7) ) - это синтаксис разыменования тега (иногда называемый синтаксисом «очищенный тег»).Для объектов тегов он оценивает первый объект без тегов, на который указывает объект тега (он будет рекурсивно отбрасывать цепочку объектов тегов до тех пор, пока не найдет объект без тегов).Для объектов без тегов это означает то же самое, что и без суффикса ^{}.

Ссылка refs/tags/Prod_Release_2.3 в центральном хранилище указывает на объект тега с именем 30bd19ef190cf664356c715b56044ce739f07468.
Этот объект тегав конечном итоге указывает на некоторый другой объект без тега с именем 4ae15ee04c2c41bfc7945e66f4effc746d52baec (вероятно, коммит).

Таким образом, refs/tags/Prod_Release_2.3^{} разрешается до 4ae15ee04c2c41bfc7945e66f4effc746d52baec.

6 голосов
/ 18 марта 2011

Это не тег, это указатель на коммит, на который указывает тег. Вы можете прочитать больше об этом на странице руководства git show-ref .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...