Как узнать, на какой коммит указывает тег в Git? - PullRequest
365 голосов
/ 07 декабря 2009

У меня есть куча аннотированных тегов в репозитории, и я хочу выяснить, на какой коммит они указывают. Есть ли команда, которая будет просто перечислять теги и их коммиты SHA? Проверка метки и взгляд на ГОЛОВУ кажутся мне слишком трудоемкими.

Обновление

После ответов я понял, что на самом деле я просто хотел посмотреть на историю, ведущую к тегу, для которой достаточно git log <tagname>.

Ответ, помеченный как ответ, полезен для получения списка тегов и их коммитов, о чем я и просил. Я уверен, что с помощью небольшого количества хакерских атак их можно преобразовать в сообщение SHA + Commit.

Ответы [ 18 ]

4 голосов
/ 14 июня 2012

Вы также можете получить более понятную картину того, где теги указывают на использование

git log --graph |git name-rev --stdin --tags |less

, а затем выделите нужный тег с помощью /.

Более компактный вид (--pretty=oneline) плюс все головки (-a) также могут помочь:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Выглядит немного пугающе, но при необходимости может быть добавлено псевдоним в ~/.gitconfig.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
3 голосов
/ 29 марта 2016

Это даст вам текущий хэш SHA1

Сокращенный коммит хеш

git show <tag> --format="%h" --> 42e646e

Совершить хэш

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
2 голосов
/ 07 декабря 2009

Я также хотел бы знать правильный путь , но вы всегда можете заглянуть в:

$ cat .git/packed-refs 

или

$ cat .git/refs/tags/*
2 голосов
/ 08 февраля 2017

Если вы хотите просмотреть подробную информацию о теге SOMETAG (тэггер, дату и т. Д.), Хеш коммита, на который он указывает, и немного информации о коммите, но без полной разницы, попробуйте

git show --name-status SOMETAG

Пример вывода:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....
1 голос
/ 07 декабря 2009

Это не показывает имена файлов, но, по крайней мере, вы получаете представление о хранилище.

cat .git/refs/tags/*

Каждый файл в этом каталоге содержит SHA коммита, указывающий на коммит.

1 голос
/ 23 ноября 2017

Из списка рассылки git , вот способ получить список хэшей фиксации для тегов с автоматической разыменовкой для аннотированных тегов:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
0 голосов
/ 04 сентября 2018

Можно использовать ниже, это даст хеш коммита
git show -s --format=%H <tag>^{commit}

Если требуется сокращенный хэш коммита, git show -s --format=%h <tag>^{commit}

0 голосов
/ 16 мая 2017

Таким образом, у меня есть множество папок релиза, где эти папки могут быть извлечены из одного из нескольких различных репозиториев, и могут быть dev, qa или основными ветками или могут быть производственными выпусками, извлеченными из тега, и тег может быть аннотирован или нет. У меня есть скрипт, который будет смотреть на целевую папку и получать ответ в форме -. Проблема в том, что разные версии git возвращают разные статусы для проверки тегов.

Итак, я обнаружил, что git show-ref --tags изначально работал, за исключением аннотированных тегов. Однако добавление -d добавило отдельную запись в список тегов, один для тега, другой для аннотации (коммит аннотации был идентифицирован как ^ {}, который я удалил с помощью sed).

Так что это ядро ​​моего сценария для тех, кто хочет его: -

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi
...