Как определить, на какую фиксацию указывает тег в Git?
У меня есть куча необъявленных тегов в репозитории, и я хочу выяснить, на какую фиксацию они указывают. Есть ли команда, которая будет просто перечислять теги и их фиксацию SHAs? Проверка метки и просмотр головы кажется мне слишком трудоемким.
обновление
Я понял после того, как я прошел через ответы, что на самом деле я хотел просто посмотреть на историю, ведущую к тегу, для которого git log <tagname> вполне достаточно.
в ответ, помеченный как ответ, полезен для получения списка тегов и их коммитов, что я и спросил. С небольшим количеством хакерских оболочек я уверен, что их можно преобразовать в сообщение 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 фиксации. Элемент-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" --> 42e646eCommit Hash
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, указывающий на фиксацию.
С 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}
Comments