Як я можу зрозуміти, чи вказаний тег git анотований чи легкий?


79

Я ввожу, git tagі в ньому перелічуються мої поточні теги:

1.2.3
1.2.4

Як я можу визначити, що з них коментується, а яке легше?


3
git tag -nщось робить для вас?
Оксиморон

Анотація тегу не є повідомленням про фіксацію. Ви не можете побачити це за допомогою git-log (1); вам потрібно використовувати git-show (1)
Oxymoron

git tag -n було цікаво! Але це не куленепробивно для моєї конкретної проблеми.
Г. Сільві Девіс

1
Мені подобається "git show-ref -d --tags".
Г. Сільві Девіс,

Відповіді:


55

git for-each-refповідомляє, до чого відноситься кожне посилання за замовчуванням, його ідентифікатор та тип. Щоб обмежити його лише тегами, зробіть git for-each-ref refs/tags.

[T] Вивід має три поля: хеш об'єкта, тип об'єкта та ім'я у посиланнях / тегах, яке посилається на об'єкт. Так званий "полегшений" тег - це назва у посиланнях / тегах, що стосується commitоб'єкта. "Анотований" тег - це ім'я у посиланнях / тегах, яке стосується tagоб'єкта.

- Соломон Повільний (у коментарях)

Ось приклад:

git for-each-ref refs/tags                                           
902fa933e4a9d018574cbb7b5783a130338b47b8 commit refs/tags/v1.0-light
1f486472ccac3250c19235d843d196a3a7fbd78b tag    refs/tags/v1.1-annot
fd3cf147ac6b0bb9da13ae2fb2b73122b919a036 commit refs/tags/v1.2-light

8
Коли я спробував це, у результатах кожного тегу було вказано або a, commitабо a tag. Я припускаю, що це вказує на легкі та анотовані теги відповідно?
Стевойсяк

4
@StevenVascellaro Це правильно, полегшений тег - це просто локальний реф, що починає "refs / tags", він може бути до чого завгодно. Тег в об'єкті db має більше, ніж просто ім'я, і ​​може передаватися як будь-який інший об'єкт. Git робить локальні посилання для кожного тегу в об'єкті db, тому різниця дещо розмита, як правило, ніхто не повинен дбати про те, як тільки робочий процес налаштований для їх проекту.
jthill

3
Тож commitлегкий і tagанотований?
Pontiacks

6
@Pontiacks, вихідні дані мають три поля: хеш об'єкта, тип об'єкта та ім'я у посиланнях / тегах, яке посилається на об'єкт. Так званий "полегшений" тег - це назва у посиланнях / тегах, що стосується commitоб'єкта. "Анотований" тег - це ім'я у посиланнях / тегах, яке стосується tagоб'єкта.
Соломон Повільний

44

Це 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" коментувався).


26

Отримайте назву тегу (скажімо foo), а потім виконайте a git cat-file -t foo. Якщо це анотований тег, cat-fileвін скаже вам, що це "тег". Якщо це простий тег, cat-fileвін скаже вам, що це "коміт".

Оновлення: Як сказав оксиморон у своєму коментарі, він git showтеж працює, але він надає більше інформації, ніж просто про тег.


3
Щодо "заданого тегу" (як зазначено у питанні), це, мабуть , найкраща відповідь.
Філс

2
Відмінна відповідь - ключовим фактором того, як це працює, є опція "-t" у "git cat-file". Як пояснює man-сторінка: "-t Замість вмісту покажіть тип об'єкта, позначений <object>."
Г. Сільві Девіс,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.