Как узнать, на какой коммит указывает тег в Git?


411

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

Обновить

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

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


3
Я хочу указать, что git show-refпоказывает ша тега, а не ревизии репо. $ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD теперь находится на c7f8831 ... $ git checkout 08b9c77 HEAD сейчас на c7f8831 ...
Константин Пелепелин

если ваши теги аннотированы, тогда вам нужно--dereference
Тревор Бойд Смит

Ответы:


348

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

$ git rev-list -n 1 $TAG

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

[alias]
  tagcommit = rev-list -n 1

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

$ git tagcommit $TAG

30
Почему бы не использовать git rev-parse <tag>? Или git rev-list -1 <tag>?
Якуб Наребски

52
@ Jakub: git rev-parse $TAGвозвращает SHA1 объекта тега, а не коммит, на который он указывает. git rev-list -1работает, хотя.
Мипади

11
@mipadi: Для не-аннотированный тегах soedn't значения; для аннотированных тегов вы можете использовать git rev-parse $TAG^{commit}или git rev-parse $TAG^{}разыменовать аннотированный / подписанный тег
Jakub Narębski

5
Вы можете использовать:git rev-list $TAG --max-count=1
b73

4
@RobinHsu: если у вас есть аннотированные теги, созданные с помощью git tag -aили git tag -s, то git rev-parse <tag>вы получите SHA-1 самого объекта тега , а git rev-list -1 <tag>SHA-1 коммита (ревизии), на который он указывает, так же, как git rev-parse <tag>^{commit}. НТН.
Якуб Наребски

240
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/packed-refsили.git/refs/tags/*
Игорь Зевака

3
хммм. в моем хранилище происходит странное поведение: тег git -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; см. ответ Якуба Наребского
NickSoft,

6
это работает, хотя мне интересно, не имеет ли смысла git tag --verboseпоказывать их тоже?
неполярность

34
Это покажет ссылку самого тега, а не фиксацию, на которую указывает тег. Вам нужно добавить -dфлаг, чтобы получить указанный коммит (во второй строке).
Старый Pro

4
@CharlesBailey, достаточно справедливо, но вопрос и ответы превратились в аннотированные теги, и тот факт, что git show-refэти два тега ведут себя по-разному, не является очевидным или общеизвестным.
Старый Про

104

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

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


7
На SO, когда у вопроса есть много разных возможных ответов, сначала публикуются ответы, которые сначала публикуются, ставя их в верхней части списка и, таким образом, получая больше голосов позже. Это петля обратной связи смещения, основанная на скорости отклика, а не на качестве отклика. При достаточном воображении эту проблему можно решить.
Самбест

6
«Лучшее решение» для чего? Если интерес заключается в том, чтобы узнать SHA коммита, тег указывает на «git show <mytag>», НЕ лучшее решение. Эта команда покажет весь diff, который вводит коммит. Для перечисления только SHA коммита тег указывает на «git rev-list <mytag> -n 1» - это правильное решение.
DolphinDream

Это не ответ на вопрос ОП. git show <tag>показывает разницу, а не фиксацию, на которую указывает тег.
demisx

@demisx О чем ты говоришь ?? Он определенно показывает хеш коммита, тегер, дату и другую информацию. Попробуй это.
Хлунг

4
@Hlung Как указывал @DolphinDream, git showна экран выводится гораздо больше материала, которого там не должно быть. Это скрывает фактический хеш коммита, который каждый ищет. Лучшая команда, git log -1 [tag-name]или, git log -1 --pretty=oneline [tag-name]если вы хотите oneliners.
demisx

40

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

git show-ref --dereference TAG дополнительно показывает коммит, на который указывает


34

От Игоря Зевака :

Резюме

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

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

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

  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( ответ ) в зависимости от того, является ли тег локальным или получен с удаленного компьютера.


33

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

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

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


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


11
Я предпочитаю, git rev-parse <tag>~0который также, кажется, работает, и не требует специального экранирования в Windows (для которого необходимы четыре шляпы (^) вместо одной). Суффикс ~<number>дает <номер> родительский коммит, поэтому ~0выдает сам коммит. Кстати, ^0также является допустимым сокращением для ^{commit}суффикса ревизии.
Аттила



8

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

git show mytag | head -1    

С коммитомgit show --oneline mytag | head -1
Stphane

7

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

git log --decorate=full

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


4

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

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

4

Короткий ответ после Git-2

Я знаю, что этот вопрос был здесь давно. И ответ от CB Bailey на 100% правильный:git show-ref --tags --abbrev

Мне больше нравится этот, так как он использует git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Просто. Короткий.

PS псевдоним это как git taglistс этой командой:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"


2

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

cat .git/refs/tags/*

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


Это не сработало, так как, я думаю, я вытащил метки с пульта. .git/packed-refsвсе же работал.
Игорь Зевака

2

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

$ cat .git/packed-refs 

или:

$ cat .git/refs/tags/*

Правильно, поэтому поведение упакованных ссылок и тегов / ссылок несколько отличается, упакованные ссылки - это текстовый файл, содержащий теги и SHA, тогда как ссылки / теги / представляют собой каталог с текстовыми файлами, названный в честь тега, содержащего SHA. Я на самом деле думаю, что правильный способ сделать это с git rev-list.
Игорь Зевака

2

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

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

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

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

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

1
кажется, не работает в версии, которую я имею, но git log <tag> -n 1 --pretty=%Hработает
Энди

2

Если вы хотите увидеть подробную информацию о теге 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) .....

0

Таким образом, у меня есть множество папок релиза, где эти папки могут быть извлечены из одного из нескольких различных репозиториев, и могут быть 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/^.*\/(.*)$/\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

0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.