Как узнать, на какую фиксацию указывает тег в Git?

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

обновление

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

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

18 ответов


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

$ git rev-list -n 1 $TAG

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

[alias]
  tagcommit = rev-list -n 1

а затем вызовите его с:

$ git tagcommit $TAG

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

просто использовать git show <tag>

однако он также сбрасывает фиксацию различий. Чтобы опустить эти различия, используйте git log -1 <tag>. (Спасибо @DolphinDream и @demisx !)


использовать

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

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


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


в моем репозитории,git show-ref TAG показывает хэш тега, а не хэш фиксации, на которую он указывает.

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


С Игорь Zevaka:

резюме

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

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

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

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

  4. git rev-parse $TAG (ответ) покажет SHA1 необъявленного тега.

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

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


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

git log -1 $TAGNAME

или

git log -1 origin/$TAGNAME

чтобы получить sha / hash фиксации, на которую ссылается тег (не sha тега):

git rev-list -1 <tag>


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

git show mytag | head -1    

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

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

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

Сокращенный Хэш Фиксации

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

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

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

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

git log --decorate=full

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


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

$ cat .git/packed-refs 

или:

$ cat .git/refs/tags/*

Если вы хотите увидеть детали тега 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) .....

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

cat .git/refs/tags/*

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


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

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

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

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

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

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

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

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