Подтвердить что ты не робот

Как получить последний Git критерий соответствия regex критериям

Мне нужна команда Git для получить/найти последний тег, начинающийся с 'v', чтобы получить последнее завершение версии (я использую теги с буквой v в начале, чтобы пометить следующую версию приложения ( пример: v0.9.1beta​​strong > ).

Есть ли способ сделать это?

4b9b3361

Ответ 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]+).*/