Как я могу определить, является ли данный тег git аннотированным или легким?
Я печатаю git tag
и перечисляет мои текущие теги:
1.2.3
1.2.4
Как я могу определить, какая из них аннотирована, а какая - легкая?
Ответы
Ответ 1
git for-each-ref
говорит вам, что каждый реф по умолчанию, его идентификатор и его тип. Чтобы ограничить его только тегами, выполните git for-each-ref refs/tags
.
[T] он выводит три поля: хеш объекта, тип объекта и имя в refs/tags, которое ссылается на объект. Так называемый "легкий" тег - это имя в ссылках/тегах, которое ссылается на объект commit
. "Аннотированный" тег - это имя в ссылках/тегах, которое ссылается на объект tag
.
- Solomon Slow (in the comments)
Ответ 2
Сортировка команды git show-ref -d --tags
делает это, поскольку яркие теги появляются один раз на выходе, а аннотированные теги появляются дважды. Кроме того, только аннотированные теги включают в себя оператор "^ {}" разыменования на выходе.
588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.3
7fe2caaed1b02bb6dae0305c5c0f2592e7080a7a refs/tags/1.2.4
588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.4^{}
И этот вывод может быть массирован с помощью команд unix sort, sed, cut и uniq, чтобы сделать вывод более читаемым:
git show-ref -d --tags |
cut -b 42- | # to remove the commit-id
sort |
sed 's/\^{}//' | # remove ^{} markings
uniq -c | # count identical lines
sed 's/2\ refs\/tags\// a /' | # 2 identicals = annotated
sed 's/1\ refs\/tags\//lw /'
Для моего исходного репо (из моего вопроса) он выводит это:
lw 1.2.3
a 1.2.4
(например, 1.2.3 был "легким" и "1.2.4" был аннотирован).
Ответ 3
Получить имя тега (скажем foo
), а затем сделать git cat-file -t foo
. Если это аннотированный тег, cat-file
скажет вам, что это "тег". Если это простой тег, cat-file
скажет вам, что это "commit".
Обновление: Как сказал в своем комментарии оксюморон, git show
работает тоже, но он дает вам больше информации, чем просто те теги.
Ответ 4
Попробуйте использовать git describe
https://git-scm.com/docs/git-describe
По умолчанию (без --all или --tags) git описать только показывает аннотированные теги.