Git Tag list, отображение коммитов sha1 - PullRequest
82 голосов
/ 10 января 2012

, поэтому команда git tag выводит список текущих тегов git

tag1
tag2

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

tag1  blah blah
tag2  blah blah

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

Ответы [ 8 ]

117 голосов
/ 10 января 2012

Как насчет этого?

git show-ref --tags
35 голосов
/ 21 сентября 2014

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

14 голосов
/ 30 ноября 2012

Аннотированные теги имеют свой собственный 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^{}
8 голосов
/ 28 сентября 2012

У меня был похожий вопрос, но я хотел получить хеш (нескольких) определенных тегов.Я обнаружил, что «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? .

8 голосов
/ 10 января 2012

Чтобы получить SHA1, на который ссылается любая ссылка (ветвь, тег ...), используйте git rev-parse:

git rev-parse tag1^0 tag2^0

. Она будет печатать только полные SHA1 в отдельных строках.Суффикс ^0 является специальным синтаксисом, чтобы гарантировать, что он напечатает SHA1 коммита, на который указывает тег, независимо от того, аннотирован он или нет.(Аннотированные теги - это самостоятельные объекты, которые содержат указатель на фиксацию вместе с метаданными. Если вы знаете, что тег аннотирован, и хотите использовать тег SHA1, просто пропустите ^0.)

Конечно, вам не нужно часто это делать, поскольку любая команда Git, которая принимает SHA1, также должна принимать тег!

3 голосов
/ 10 января 2012

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

2 голосов
/ 23 ноября 2017
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

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

0 голосов
/ 26 апреля 2019

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

Результат - результат, идентичный 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.

...