Как определить, на какой фиксатор указывает тег в Git?

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

Update

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

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

Ответ 1

Один из способов сделать это будет с git rev-list. Следующее выведет фиксацию, на которую указывает тег:

$ git rev-list -n 1 $TAG

Вы можете добавить его как псевдоним в ~/.gitconfig, если вы его много используете:

[alias]
  tagcommit = rev-list -n 1

И затем назовите его с помощью:

$ git tagcommit $TAG

Ответ 2

git show-ref --tags

Например, git show-ref --abbrev=7 --tags покажет вам что-то вроде следующего:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

Ответ 3

Почему все так сложно?

Просто используйте git show <tag>

UPDATE. Пока git show <tag> показывает хеш фиксации в первой строке, он также выдает diff в командной строке в некоторой ситуации (например, нечетные коммиты). Чтобы игнорировать эти нежелательные различия в результате, вместо этого используйте git log -1 <tag>. (Благодаря @DolphinDream и @demisx!)

Ответ 4

Использование

git rev-parse --verify <tag>^{commit}

(который вернет SHA-1 коммита даже для аннотированного тега).


git show-ref <tag> также работает, если <tag> не аннотируется. И всегда есть git for-each-ref (подробности см. В документации).

Ответ 5

В моем репозитории git show-ref TAG отображается хеш тега, а не хеш сообщения, на который он указывает.

git show-ref --dereference TAG показывает, кроме того, что фиксация указана на.

Ответ 6

Из Игорь Зевака:

Резюме

Поскольку существует около 4 почти одинаково приемлемых, но разных ответов, я суммирую все различные способы скин-тега.

  • git rev-list -1 $TAG (ответ). git rev-list выводит коммиты, которые приводят к $TAG, аналогичному git log, но отображают только SHA1 коммита. -1 ограничивает вывод на фиксацию, на которую указывает точка.

  • git show-ref --tags (answer) покажет все теги (локальные и извлеченные из удаленного) и их SHA1.

  • git show-ref $TAG (answer) покажет тег и его путь вместе с SHA1.

  • git rev-parse $TAG (answer) покажет SHA1 неавтоматизированного тега.

  • git rev-parse --verify $TAG^{commit} (answer) покажет SHA1 как аннотированных, так и неавтоматизированных тегов. В Windows используйте git rev-parse --verify %TAG%^^^^{commit} (четыре шляпы).

  • cat .git/refs/tags/* или cat .git/packed-refs (answer) в зависимости от того, является ли этот тег локальным или извлечен из удаленного.

Ответ 7

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

git log -1 $TAGNAME

ИЛИ

git log -1 origin/$TAGNAME

Ответ 8

Чтобы получить sha/хэш коммита, на который ссылается тег (а не шаг тега):

git rev-list -1 <tag>

Ответ 9

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

git show mytag | head -1    

Ответ 10

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

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

Ответ 11

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

Сокращенное коммандное хеш

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

Commit Hash

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

Ответ 12

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

git log --decorate=full

Он покажет ветки, которые заканчиваются/начинаются с фиксации, а теги для коммитов.

Ответ 13

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

$ cat .git/packed-refs 

или

$ cat .git/refs/tags/*

Ответ 14

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

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) .....

Ответ 15

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

cat .git/refs/tags/*

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

Ответ 16

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

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

Ответ 17

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

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

Итак, это ядро ​​моего script для всех, кто этого хочет: -

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