Как определить, на какой фиксатор указывает тег в 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