Как получить последний Git критерий соответствия regex критериям
Мне нужна команда Git для получить/найти последний тег, начинающийся с 'v', чтобы получить последнее завершение версии (я использую теги с буквой v в начале, чтобы пометить следующую версию приложения ( пример: v0.9.1betastrong > ).
Есть ли способ сделать это?
Ответы
Ответ 1
Я использую для этого следующую команду:
git describe --match "v[0-9]*" --abbrev=4 HEAD
Он также изменит версию, если вы сделали что-то с исходным деревом с момента последнего тега с версией.
Обратите внимание, что это не регулярное выражение, а глобус, но работает для приведенного примера.
Ответ 2
git tag -l -n v*
Ответ 3
Ответ KARASZI István уже объясняет, как найти теги, соответствующие glob, что обычно достаточно хорошо. Если вам когда-нибудь понадобится реальный RegEx:
for tag in $(git tag | grep YOURREGEX); do
git describe --tags --long --match="$tag" 2>/dev/null
done | sort -k2 -t"-" | head -n1
- Если вам нужен только ближайший тег (то есть
--abrev=0
), добавьте | cut -d"-" -f1
- Если вы не хотите, чтобы поведение
--long
также выводило точно соответствующий тег, включая часть -0-hash
, добавьте | sed -e's/-0-.*$//'
вместо этого.
В теге вопроса, вероятно, будет использоваться Regex ^v\d+\.\d+\.\d+\D*$
(хотя \D*$
может быть необязательным).
Ответ 4
Пока достаточно одного регулярного выражения --match "v[0-9]*"
, знайте, что Git 2.13 (Q2 2017) улучшит это:
" git describe
" и " git name-rev
" научили брать более одного шаблона refname, чтобы ограничить набор ссылок, чтобы основывать их именования выходных данных, а также научились принимать отрицательные шаблоны для имя refs не может использоваться для именования через опцию "--exclude
".
См. commit 77d21f2, commit 43f8080, commit 96415b4, commit 290be66, commit 4a68748 (18 января 2017 г.) Якоб Келлер (jacob-keller
).
(объединено Junio C Hamano - gitster
- в commit 1b32498, 27 февраля 2017 г.
Теперь у вас может быть шаблон множественного соответствия:
--match <pattern>:
Учитывать только теги, соответствующие заданному шаблону glob(7)
, за исключением префикса "refs/tags/".
Это можно использовать, чтобы избежать утечки личных тегов из репозитория.
Если задано несколько раз, будет накоплен список шаблонов, и будут учитываться теги, соответствующие любому из шаблонов.
Используйте --no-match
, чтобы очистить и reset список шаблонов.
И теперь у вас есть исключить шаблон (или несколько)!
--exclude <pattern>::
Не учитывайте теги, соответствующие заданному шаблону glob(7)
, исключая префикс "refs/tags/".
Это можно использовать для сужения пространства тегов и поиска только тегов, соответствующих некоторым значимым критериям.
Если задано несколько раз, будет скопирован список шаблонов, и теги, соответствующие любому из шаблонов, будут исключены.
В сочетании с --match
тег будет рассмотрен, если он соответствует хотя бы одному шаблону --match
и не соответствует ни одному из шаблонов --exclude
.
Используйте --no-exclude
, чтобы очистить и reset список шаблонов.
Ответ 5
Кроме того, с помощью git description вы можете получить последний тег, недоступный для HEAD, с помощью:
git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)
Ответ 6
git describe --match v*
Используйте это.
Ответ 7
Проблема с использованием git describe
, как и другие ответы, заключается в том, что git describe
покажет вам теги, которые доступны из HEAD (или комманды, которые вы указываете).
Представьте, что у вас есть 3 тега, v1, v2 и v3. Если HEAD находится в точке между v2 и v3, git describe
вернет v2, а не v3.
Если вам действительно нужен последний тег, в первую очередь вам нужны аннотированные теги, поскольку легкие теги не имеют метаданных даты.
Затем эта команда сделает это:
git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*
Ответ 8
Я использую
git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"
git tag
интерпретирует шаблон как glob. Поэтому вы не можете указать полноэкранное регулярное выражение. Просто используйте минимальный глобус (v *) или даже никакой глобус вообще. Вы получите более одного совпадающего тега в отсортированном порядке (с самой высокой версией тега), и вы сможете повторно вывести результат.
Ответ 9
Что-то более сложное было бы по направлениям:
/v[0-9]+(\.[0-9]+).*/