Как узнать, на какую фиксацию указывает тег в 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 почти одинаково приемлемых, но разных ответов, я обобщу все различные способы очистки тега.
git rev-list -1 $TAG
(ответ).git rev-list
выводит коммиты, которые приводят к$TAG
аналогичноgit log
но показывает только SHA1 фиксации. The-1
ограничивает вывод точками фиксации на.git show-ref --tags
(ответ) покажет все теги (локальные и извлеченные из удаленного) и их SHA1s.git show-ref $TAG
(ответ) покажет тег и его путь вместе с SHA1.git rev-parse $TAG
(ответ) покажет SHA1 необъявленного тега.git rev-parse --verify $TAG^{commit}
(ответ) покажет SHA1 как аннотированного, так и необъявленные теги. В Windows используйтеgit rev-parse --verify %TAG%^^^^{commit}
(четыре шляпы).cat .git/refs/tags/*
илиcat .git/packed-refs
(ответ) в зависимости от того, является ли тег локальным или извлеченным из удаленного.
Я хотел бы узнать "правильный" способ, но в то же время, вы можете сделать это:
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}