Як знайти тег, пов'язаний з даним комітом git?


90

Для випусків я зазвичай позначаю щось на зразок v1.1.0. Під час мого сценарію збірки я створюю файл fwVersion.c, який містить поточну інформацію про git. Наразі у файлі є інформація про коміти та гілки, але я хотів би додати тег.

Чи можливо це?

Відповіді:


114

Перевірте документацію для git describe. Він знаходить найближчий тег до даного коміту (тобто тег, який вказує на предка коміту) і описує цей коміт з точки зору тегу.

Якщо ви хочете лише знати, чи на коміт вказує тег, ви можете перевірити результати:

git describe --exact-match <commit-id>

32
git describe --tags <commit-id>для неназваних міток
Олександр Левчук

1
Я обожнюю це. Зокрема, мені подобається, що я можу прочитати людину з поточної редакції:git describe --all --exact-match `git rev-parse HEAD`
dsummersl

5
У новіших версіях git describe --tags --abbrev=0 REVце буде корисно, коли ви не хочете сміття на тезі.
Крейг Рінгер

1
git describe --all(для поточного перевіреного коміту) або git describe --all <commit>завжди робив майже все, що я коли-небудь хотів.
rfay

Найкраща частина використання версій з git - це не більше жорсткого кодування версії у вихідному коді при розгортанні програмного забезпечення. Спосіб git опису пошуку найближчого тегу можна використовувати для обчислення номера наступної версії і просто додати ref тегу до репозиторію та імені пакета.
Сід

62

Якщо вам потрібно перший тег, що містить коміт, тоді:

git describe --contains <commit>

дає найкращу відповідь IMO. Якщо у вас часті теги, ніж використання "git tag --contens" у старому коміті у великому сховищі може зайняти деякий час для запуску та надасть вам усі теги, що містять цей коміт.

Ця форма опису git працює дуже швидко і дає вам одне вихідне значення, яке є першим тегом, що містить коміт і наскільки віддалений ваш коміт.


27

Як щодо цього?

git tag --points-at <commit-id>

Він дає вам усі теги, які має даний коміт (тоді як git describeлише один), і не включає теги для комітів-нащадків (як git tag --containsце робить).


Мені це подобається, тому що на stderr не пишеться повідомлення про помилку. Дякую.
Басуке

23

Ви можете знайти цю інформацію в посібнику

git tag --contains <commit>

3
Тут буде перераховано всі теги, що містять даний коміт (тобто теги, які вказують на дочірні дані даного коміту), тому не обов'язково буде даватися один тег для даного коміту або будь-яка інформація про тег, який є найближчим, крім випадків, коли Список містить лише один коміт.
CB Bailey

4
Як сказав Чарльз Бейлі вище, це не зовсім те, що я шукаю. Може, вам слід RTFM :)
wes

1
Ну, вибачте за неправильну відповідь. Коли я перевірив, здавалося, робив те, про що ти просив. Я робив RTFM, я просто вирішував неправильну проблему. Надія Бейлі запропонувала рішення, яке допоможе вам.
dharga

6
вам не потрібно читати цілі інструкції з git, перш ніж задавати питання git на SO, так? google індексує ТАК набагато краще, ніж будь-яка сторінка git man ...
aaronstacy

13

Я знайшов комбінацію обох найкращих відповідей, щоб дати мені те, що я хотів так:

git describe --tags --exact-match <commit-id>

Це дає вам тег, який призначений ТІЛЬКИ для цього коміту та для тих, хто не має анотацій. Корисно, коли ви хочете знайти теги і не турбуватися про те, щоб видалити форматування тоді (наприклад, для Дженкінса).

напр. $ git describe --tags --exact-match head~2

Дає вам:

$ ReleaseBeta

0

Консолідація деяких відповідей:

git tag --contains [<ref>]

і

git tag --points-at [<ref>]

або просто

git tag

поводитись однаково, друкуючи будь-які (і всі) теги для вказаного ref або поточного коміту, якщо не вказано.

git describe --tags [<ref>]

де <ref>за замовчуванням є поточним комітом, виходить із 128, якщо з комітом не пов’язані теги, і друкує тег, пов’язаний із комітом (шаблону, схоже, немає).

git describe [<ref>] поводиться так само, як і за --tagsвинятком того, що друкує лише анотовані теги.

Надавши опцію --containsto, describeбуде надруковано тег, який пов'язаний з предком вказаного коміту. Наприклад

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.