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

При перечислении git -ls-remote, почему там "^ {}" после имени тега?

Когда я запускаю git ls-remote в дереве работ, команда выводит список изменений в репо-источнике. По какой-то причине я получаю 2 ревизии с каждым тегом и для второй ревизии одного и того же тега, имя тега включает ^{}

git ls-remote
From [email protected]:andris9/zzzzzz.git
d69e66d7c915b9682618b7f304b80cc0ae4c7809    HEAD
....
bb944682f7f65272137de74ed18605e49257356c    refs/tags/v0.1.6
771a930dc0ba86769d6862bc4dc100acc50170fa    refs/tags/v0.1.6^{}
a72251d945353a360087eb78ee75287c38a1c0e6    refs/tags/v0.1.7
d69e66d7c915b9682618b7f304b80cc0ae4c7809    refs/tags/v0.1.7^{}

Я создаю теги с

git tag -a v0.1.8 -m "tag message"
git push --tags

Из примеров git-ls-remote man page таких дубликатов нет, так что, возможно, я что-то делаю неправильно?

4b9b3361

Ответ 1

Существует 2 типа тегов - lightweight и annotated. Легкие теги - это просто ссылки, указывающие на какой-то объект, тогда как аннотированные теги являются отдельным объектом git сами и хранят гораздо больше информации, такой как автор, коммиттер, сообщение фиксации и т.д.

Когда вы использовали git tag -a для создания тега, git создал бы для вас аннотированный тег.

^{} - это синтаксис, используемый для разыменования тега. Он описан в gitrevisions.

  • При использовании с объектами тегов git рекурсивно разыгрывает тег до тех пор, пока не найдет объект без тегов.

  • При использовании с объектами без тегов он ничего не делает и эквивалентен пропуску ^{}

Ссылка refs/tags/v0.1.6 ref в вашем репозитории указывает на объект тега bb944682f7f65272137de74ed18605e49257356c, который, в свою очередь, указывает на 771a930dc0ba86769d6862bc4dc100acc50170fa (объект без тегов), который, как я предполагаю, является сохранением информации о фиксации при создании тега.

Итак, когда вы делаете refs/tags/v0.1.6^{}, git будет разыменовывать тег и разрешать его на 771a930dc0ba86769d6862bc4dc100acc50170fa - объект без тегов.

Существует также команда git show-ref, которая может использоваться для перечисления только тегов и, необязательно, разыменования следующим образом, и в вашем случае должен производиться следующий вывод:

$ git show-ref --tags
bb944682f7f65272137de74ed18605e49257356c    refs/tags/v0.1.6
a72251d945353a360087eb78ee75287c38a1c0e6    refs/tags/v0.1.7

$ git show-ref --tags --dereference
bb944682f7f65272137de74ed18605e49257356c    refs/tags/v0.1.6
771a930dc0ba86769d6862bc4dc100acc50170fa    refs/tags/v0.1.6^{}
a72251d945353a360087eb78ee75287c38a1c0e6    refs/tags/v0.1.7
d69e66d7c915b9682618b7f304b80cc0ae4c7809    refs/tags/v0.1.7^{}

Чтобы подтвердить это, вы можете использовать команду git show, чтобы предоставить вам более подробную информацию об объекте git.

Это информация из одного из моих тестовых хранилищ git.

$ git show 43f9a98886ba873c0468c608f24c408b9991414f
tag v0.1
Tagger: Ash <[email protected]>
Date:   Sun Jul 15 00:14:43 2012 -0700

Tagging Stable repo 0.1 :)
-----BEGIN PGP SIGNATURE-----
<PGP-SIGNATURE>
-----END PGP SIGNATURE-----

commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
Merge: 796efcd 58e3a4d
Author: Ash <[email protected]>
Date:   Sun Jul 15 00:02:44 2012 -0700

    Merge branch 'dev' into 'master' for stable 0.1.

$ git show e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
Merge: 796efcd 58e3a4d
Author: Ash <[email protected]>
Date:   Sun Jul 15 00:02:44 2012 -0700

    Merge branch 'dev' into 'master' for stable 0.1.