Як перерахувати всі теги, що вказують на певний коміт у git


85

Я бачив команди git describeі , git-name-revале мені не вдалося отримати їх в список більше одного тега.

Приклад: У мене є sha1 48eb354, і я знаю, що теги A і B вказують на нього. Тож я хочу команду git, git {something} 48eb354яка видає результат, подібний до "A, B". Мені не цікаво знати посилання щодо інших тегів чи гілок, лише точні збіги тегів.

Відповіді:


46

git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'

повинен працювати як для легких, так і для анотованих тегів.


Дякую. Саме те, що я хочу.
mrutyunjay

Це добре працює для git <1.7.10. Чи можете ви пояснити, що робить ця друга частина виразу sed? -e 's/\^{}//'
Дейв

Ах, неважливо, розібрався. Це для -dопції на git show-ref. З документів, "-d, --dereference Теги розпізнавання також в ідентифікатори об'єктів. Вони будуть відображатися з додаванням" ^ {} "."
Дейв

1
Невелике вдосконалення / узагальнення для використання довільних ${ref}, включаючи анотовані теги:hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
Крістіан Гьотце


50

Ви можете використовувати:

git tag --contains <commit>

що показує всі теги при певному коміті. Його можна використовувати замість:

git tag --points-at HEAD

що доступно лише з 1.7.10.


10
NB: 'git tag --contains' не відображає лише теги, які вказують на коміт, але також включає будь-які пізніші теги, з яких він доступний.
staafl

Принаймні у версії 2.6.4 це повертає лише один тег, який вказує на вказаний коміт. Це не повертає їх усіх. Відповідь @max вище, здається, працює належним чином для декількох тегів.
Dejay Clayton

--containsтакож виглядає набагато повільніше, ніж --points-at(час виконання 7-8 с проти <1 с)
SSilk,

4
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
  grep ^$commit_id |
    cut -d' ' -f2

Шкода, що це не можна зробити простіше. Інший прапор git tagдля включення ідентифікаторів комітів може виражати це git for-each-refвиклик природним чином.


1
Дякую за інформацію, але, здається, я теж не можу бачити теги за допомогою цієї команди. Використання простішого "git for-each-ref | grep 48eb354" дає 0 збігів. gitk, з іншого боку, красиво перераховує 2 теги перед цим комітом.
Zitrax

1

Наступна команда виконує завдання, але безпосередньо аналізує вміст каталогу .git і, отже, може зламатись, якщо зміниться формат сховища git.

grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'

Їх також не перераховано, єдине місце, де я бачу sha1, якщо копіювання всієї папки .git знаходиться у gitk.cache та журналах / refs / remotes / origin / master. Як так, gitk може їх перерахувати? Я також помічаю, що теги, які я розглядаю, є анотованими тегами, можливо, тому дві поточні відповіді для мене не працюють.
Zitrax

1

Для поточного коміту ви можете використовувати

git tag --points-at $(git log -n1 --pretty='%H')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.