Список тегів Git, відображення фіксованих шахів х1


101

тому git tagкоманда перераховує поточні теги git

tag1
tag2

git tag -n друкує повідомлення тегу

tag1  blah blah
tag2  blah blah

Який найкращий спосіб отримати хеш тегів1 та tag2?


1
Не питання, яке я розглядаю окремо, але мені цікаво, чому git tag( -nабо якийсь інший варіант ...) в першу чергу не відображаються хеші. Приємно бачити, які рішення люди придумують, але я вважаю це недоліком дизайну у доступних варіантах.
andreee

Відповіді:


142

Щоб отримати теги git за допомогою хеша SHA1 об’єкта Tag, ви можете запустити:

git show-ref --tags

Тоді вихід буде виглядати приблизно так:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Кожен рядок - хеш SHA1 тегу, а потім ім'я тегу з префіксом refs/tags/ .

Якщо ви хочете, щоб хеш SHA1 комітки, замість об'єкта тегу, ви можете запустити:

git show-ref --tags -d

Це дасть вихід, як:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

Рядки, що закінчуються, ^{}починаються з хеша SHA1 фактичної фіксації, на яку вказує тег.


7
Зауважте, це не відрізнятиме полегшені та помічені теги. Для легких тегів буде показано фіксацію, а для помічених тегів - хеш самого об’єкта тегів.
Лілі Баллард

20
Щоб відобразити список тегів із відхиленими відхиленнями (у разі анотованих тегів), використовуйте git show-ref --tags -d. Відменені теги розміщуються з поштою "a" ^{}.
С. Крістофер Елісен

49

git tagКоманда недорозвинена. Бажано багато, але цього не вистачає, як-от повна інформація про теги та теги в порядку історії фіксації.

Мені це подобається замість цього, що дає саме те, що я хочу, але не можу отримати git tag:

git log --oneline --decorate --tags --no-walk

Це дає дуже хороший кольоровий вид тегів у зворотному хронологічному порядку (як це було б у повному журналі). Таким чином, ви не тільки бачите теги, ви також будете бачити скорочені хеші та повідомлення про фіксацію тегу.


Я його псевдонімом git tі git tagsтаким чином:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Примітка. Мені довелося використовувати перенаправлення bash, git tоскільки Git не підтримує виклик псевдоніма з іншого псевдоніма (який є обломкою).


Якщо ви хочете побачити дату та час здійснення, спробуйте:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

Ви можете використовувати інші формати дати в --dateопції, а також повністю контролювати вихід, щоб відповідати вашому унікальному смаку в --prettyопції. Обидва варіанти добре задокументовані в Документації git-log .


2
Хоча це не те, що запитувала ОП (відображає хеш-шафи ), це дуже корисно, оскільки повідомлення про фіксацію також можуть бути зручними. +1 від мене.
Stelios Adamantidis

2
@nealmcb git logпотужний! Ви можете змусити його показувати саме те , що ви хочете. Спробуйте git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Можливі й інші формати дати. Просто знайдіть --dateсторінку довідки. Я оновив свою відповідь, щоб включити цю опцію.
ADTC

1
@SteliosAdamantidis Насправді моя відповідь дає скорочені хеші SHA1 (перші 7 символів), і якщо ви хочете повноцінні хеші, ви завжди можете їх змінити за допомогою --prettyта %H. Дякую за +1 :)
ADTC

15

Помічені теги мають свій власний SHA − 1, тому нам потрібно їх знецінити. Однак полегшені теги неможливо відкинути, оскільки вони вже вказують на вчинення. Щоб вирішити, ми повинні перерахувати обидва та відфільтрувати об'єкти фіксації:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Результат з легкими тегами:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Результат із поміченими тегами:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

Використання git log --tags --oneline --no-walkтакож автоматично визначає позначені теги. :)
ADTC

11

Щоб отримати SHA1, на який посилається будь-який тип посилання (гілка, тег ...), використовуйте git rev-parse:

git rev-parse tag1^0 tag2^0

Він буде друкувати лише повні SHA1, окремими рядками. ^0Суфікс спеціальний синтаксис, щоб переконатися , що це буде друкувати SHA1 коммітов , на який вказує тег, будь то анотований чи ні. (Помічені теги - це самі по собі об'єкти, які містять вказівник на комісію разом із метаданими. Якщо ви знаєте, тег є анотованим, і ви хочете, щоб тег був SHA1, просто залиште його ^0.)

Звичайно, вам це не потрібно часто робити, оскільки будь-яка команда Git, яка приймає SHA1, також повинна приймати тег!


Найкраща відповідь тут, дякую @Jefromi. Зауважте, що в оболонці Windows cmd будь-яка команда git, що використовує ^, потрібно цитувати: наприклад, git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo

8

У мене було подібне запитання, але я хотів хеш (декілька) конкретних тегів. Я виявив, що "show-ref" візьме список тегів, тож це виконує роботу:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Однак деякі експерименти з "git show" призвели до цієї команди:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

Оскільки я набагато більше знайомий з використанням "шоу", ніж "шоу-реф", мені здається, що останнє простіше запам’ятати і корисніше.

Дивіться також приємне резюме в розділі Як визначити, на яке фіксування вказує тег у Git? .


3

Теги мають бути підписані та / або оброблені повідомленнями. У полегшених тегах немає предметів SHA1 і є лише посиланнями. Інакше спробуйте git show.


3
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

Це дає список усіх комісій для тегів. Помічені теги відновлено. Надішліть подяку тут .


Прекрасне рішення. Якщо ви хочете мати лише імена тагенів замість повного імені, ви можете змінити використання %(refname:short)замість %(refname).
Радон8472

2

Я взяв команду з анатолійського технічного поста додав заголовкове повідомлення тегів / це як приємне число.

Результат - результат, ідентичний, git tag -nале з префіксом хеш-файлу.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Якщо ви хочете мати довгий хеш замість короткого, просто замініть objectname:shortна objectname.

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