Подтвердить что ты не робот

Git tag, почему этот дублирующий тег в пультах?

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^{}.

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

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

Что-то не так? Или это по дизайну?

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

4b9b3361

Ответ 1

В Git есть два типа тегов: "легкий" и "аннотированный".

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

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

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

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


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

Ссылка refs/tags/Prod_Release_2.3 ref в вашем центральном репозитории указывает на объект тега с именем 30bd19ef190cf664356c715b56044ce739f07468.
Эти объекты тегов в конечном счете указывают на какой-то другой объект без тегов с именем 4ae15ee04c2c41bfc7945e66f4effc746d52baec (возможно, на фиксацию).

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

Ответ 2

Это не тег, это указатель на фиксацию, на которую указывает тэг. Подробнее об этом можно узнать на странице git show-ref man.