Як сказати, на яке фіксування вказує тег у Git?


410

У мене є купа не помічених тегів у сховищі, і я хочу розібратися, на які зобов'язання вони вказують. Чи є команда, яка буде просто перелічити теги та їх посвідчення SHA? Перевірка тегу та дивлення на ГОЛОВУ здається мені занадто трудомістким.

Оновлення

Я зрозумів, як переглянув відповіді, що те, що я насправді хотів, - це просто подивитися на історію, що веде до мітки, для якої git log <tagname>достатньо.

Відповідь, яка позначена як відповідь, корисна для отримання списку тегів та їх зобов'язань, про що я і запитав. Маючи трохи хакерських оболонок, я впевнений, що можна перетворити їх у повідомлення SHA + Commit.


3
Я хочу зазначити, що git show-refпоказано sha тегу, а не sha ревізії repo. $ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD зараз на c7f8831 ... $ git checkout 08b9c77 HEAD зараз о c7f8831 ...
Костянтин Пелепелін

якщо ваші теги помічені, вам знадобиться--dereference
Тревор Бойд Сміт

Відповіді:


347

Один із способів зробити це було б за допомогою 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>?
Якуб Нарбскі

51
@ Jakub: git rev-parse $TAGповертає SHA1 об’єкта тегу, а не комісію, на яку він вказує. git rev-list -1працює, хоча.
mipadi

11
@mipadi: для тегів без анотації це не має значення; для помічених тегів, якими ви можете скористатись, git rev-parse $TAG^{commit}або git rev-parse $TAG^{}для
знецінення

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}. HTH.
Якуб Нарбський

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 tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref - теги -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; дивіться відповідь Якуба Наребського
NickSoft

6
це працює, хоча мені цікаво, чи не було б сенсу git tag --verboseїх також показувати?
неополярність

34
Це покаже посилання самого тегу, а не фіксація, на яку вказує тег. Потрібно додати -dпрапор, щоб отримати посилається комісію (у другому рядку).
Старий Про

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

104

Просто використовуйте git show <tag>

Однак, це також скидає фіксування. Щоб опустити ці відмінки, використовуйте git log -1 <tag>. (Завдяки @DolphinDream та @demisx!)


7
Що стосується ТА, коли запитання має багато різних можливих відповідей, відповіді, які розміщуються вперше, отримують перевагу в першу чергу - розміщуючи їх у верхній частині списку, і, таким чином, отримуючи більше оновлень пізніше. Це зміщення циклу зворотного зв'язку, заснованого на швидкості реагування на якості відповіді. При достатній уяві цю проблему можна було б вирішити.
samthebest

6
"Найкраще рішення" для чого? Якщо інтерес полягає у з'ясуванні SHA фіксації, тег вказує на "git show <mytag>" НЕ найкраще рішення. Ця команда покаже всю різницю, яку вводить. Для переліку лише SHA комітки, тег вказує на "git rev-list <mytag> -n 1" - правильне рішення.
DolphinDream

Це не відповідь на питання ОП. git show <tag>показує diff, а не фіксацію, на яку вказує тег.
демікс

@demisx Про що ти говориш ?? Він безумовно показує хеш фіксації разом із тегером, датою та іншою інформацією. Спробуй це.
Hlung

4
@Hlung Як ​​зазначав @DolphinDream, git showна екран викидається набагато більше матеріалів, які там не повинні бути. Це затьмарює фактичний хеш-код, який ви шукаєте. Краща команда - git log -1 [tag-name]або git log -1 --pretty=oneline [tag-name]якщо ви хочете однолінійки.
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 комітів. The-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 як анотованих, так і неозначених тегів. У Windowsgit 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поступається самому виконувати. Btw, ^0також є дійсною стенограмою для ^{commit}суфікса перегляду.
Аттіла


10

Для того, щоб отримати sha / хеш коміту, на який посилається тег (а не sha тегу):

git rev-list -1 <tag>


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/*

Правильно, тому поведінка для пакуваних-refs та refs / тегів дещо відрізняється, packed-refs - це текстовий файл, що містить теги та SHA, тоді як refs / tags / - це каталог із текстовими файлами, названим після тегу, що містить 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 (теггер, дата тощо), хеш комітету, на який він вказує, і трохи інформації про фіксацію, але без повної різниці, спробуйте

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 return return status 'для оформлення тегів.

Так я і знайшов 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.