Как найти тег, связанный с данным коммитом git?

92

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

Это возможно?

Уэс
источник

Ответы:

118

Проверьте документацию для git describe. Он находит ближайший к заданной фиксации тег (т. Е. Тег, указывающий на предка фиксации) и описывает эту фиксацию в терминах тега.

Если вы хотите знать, указывает ли фиксация тегом, вы можете проверить вывод:

git describe --exact-match <commit-id>
CB Bailey
источник
32
git describe --tags <commit-id>для неаннотированных тегов
Александр Левчук
1
Мне это нравится. В частности, мне нравится то, что я могу получить читабельный git describe --all --exact-match `git rev-parse HEAD`
текст
6
В более новых версиях git describe --tags --abbrev=0 REVэто будет полезно, если вам не нужен мусор на теге.
Craig Ringer
1
git describe --all(для текущей проверенной фиксации) или git describe --all <commit>всегда делал практически все, что хотел.
rfay
Лучшая часть использования версий из git - это отсутствие жесткого кодирования версии в исходном коде при развертывании программного обеспечения. Способ поиска ближайшего тега с помощью git description можно использовать для вычисления номера следующей версии и просто добавить ссылку на тег в репо и имя пакета.
Сид,
65

Если вам нужен первый тег, содержащий фиксацию, то:

git describe --contains <commit>

дает лучший ответ ИМО. Если у вас есть частые теги, то использование "git tag --contains" в старом коммите в большом репозитории может занять некоторое время, и вы получите все теги, которые содержат этот коммит.

Эта форма git description выполняется очень быстро и дает вам одно выходное значение, которое является первым тегом, содержащим фиксацию, и насколько далеко назад находится ваша фиксация.

Джей
источник
28

Как насчет этого?

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

Он дает вам все теги, которые имеет данный коммит (тогда как git describeдает вам только один), и не включает теги для потомков коммитов (например, git tag --containsделает).

Альбертас Агеевас
источник
Мне это нравится, потому что в stderr не записывается сообщение об ошибке. Благодарю.
Basuke
24

Вы можете найти эту информацию в руководстве

git tag --contains <commit>
дхарга
источник
3
Здесь будут перечислены все теги, которые содержат данную фиксацию (т. Е. Теги, которые указывают на дочерние элементы данной фиксации), поэтому не обязательно будет указывать единственный тег для данной фиксации или любую информацию о том, какой тег является ближайшим, если только список содержит только одну фиксацию.
CB Bailey,
4
Как сказал Чарльз Бейли выше, это не совсем то, что я ищу. Может быть, вам стоит RTFM :)
wes
1
Что ж, извините за неправильный ответ. Когда я проверил, казалось, что он делает то, о чем вы просили. Я сделал RTFM, просто решил не ту задачу. Хоуп Бейли предложила решение, которое поможет вам.
dharga
6
вам не нужно читать все руководство по git, прежде чем задать вопрос по git по SO, верно? google индексирует
НАСТОЛЬКО
13

Я нашел комбинацию из обоих основных ответов, чтобы дать мне то, что я хотел:

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

Это дает вам тег, который предназначен ТОЛЬКО для этого коммита и для тех, у кого нет аннотации. Полезно, когда вы хотите найти теги и не беспокоиться об отключении форматирования (например, для Jenkins).

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

Дает тебе:

$ ReleaseBeta
Кристофер Александр
источник
0

Обобщая некоторые ответы:

git tag --contains [<ref>]

и

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

или просто

git tag

вести себя так же, печатая любые (и все) теги для указанной ссылки или текущей фиксации, если не указано иное.

git describe --tags [<ref>]

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

git describe [<ref>] ведет себя так же, как и с --tags за исключением того, что печатает только аннотированные теги.

Если задать параметр --containsto, describeбудет напечатан тег a, связанный с предком указанной фиксации. Например

$ 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

Bschlueter
источник