Список тегов Git, отображение хэшей sha1 фиксации

103

поэтому git tagкоманда перечисляет текущие теги git

tag1
tag2

git tag -n печатает сообщение тега

tag1  blah blah
tag2  blah blah

Как лучше всего получить хеш тегов tag1 и tag2?

Куанг Ван
источник
1
Я не собираюсь задавать этот вопрос отдельно, но мне интересно, почему git tag( -nили какой-то другой вариант ...) вообще не показывает хэши коммитов. Приятно видеть, какие решения придумывают люди, но я считаю это недостатком дизайна в доступных вариантах.
andreee

Ответы:

145

Чтобы получить теги 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 фактического коммита, на который указывает тег.

Peterjmag
источник
7
Обратите внимание, что это не повлияет на различия между легкими и аннотированными тегами. Для легких тегов он покажет фиксацию, а для аннотированных тегов он покажет хеш самого объекта тега.
Лили Баллард,
20
Для отображения списка тегов с разыменованными ссылками (в случае аннотированных тегов) используйте git show-ref --tags -d. Разыменованные теги имеют после себя ^{}.
S. Christoffer Eliesen
51

Команда 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 .

ADTC
источник
2
Хотя это не то, что запрашивал OP (отображение хэшей sha1 фиксации ), это очень полезно, поскольку сообщения фиксации также могут быть удобны. +1 от меня.
Стелиос Адамантидис
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".
йойо
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

Так как я гораздо больше знаком с использованием «show», чем «show-ref», я считаю, что последнее легче запомнить и более полезно.

См. Также красивое резюме в статье Как узнать, на какой коммит указывает тег в Git? .

Тед
источник
3

Теги должны быть подписаны и / или отправлены сообщения. Легкие теги не имеют объектов SHA1 и являются просто ссылками. В противном случае попробуйте git show.

Адам Димитрук
источник
3
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

Это дает список всех коммитов для тегов. Аннотированные теги разыменовываются. Отправьте сюда спасибо .

анатолий техтоник
источник
Отличное решение. Если вы хотите иметь только имена тегов вместо полного имени ссылки, вы можете изменить использование %(refname:short)вместо %(refname).
Radon8472
2

Я взял команду из сообщения anatoly techtonik, добавил заголовок сообщения тегов / коммитов и отформатировал его в виде красивых столбцов.

Результат будет идентичным, git tag -nно с префиксом commit-hash.

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.

Радон8472
источник