Как получить последний тег Git, соответствующий критериям регулярных выражений - PullRequest
37 голосов
/ 06 октября 2010

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

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

Ответы [ 9 ]

48 голосов
/ 06 октября 2010

Я использую для этого следующую команду:

git describe --match "v[0-9]*" --abbrev=4 HEAD

Она также изменит версию, если вы сделали что-то с деревом исходного кода со времени последнего тега с версией.

Обратите вниманиечто это не регулярное выражение, а глобус, но работает для предоставленного примера.

6 голосов
/ 06 октября 2010
git tag -l -n v*
4 голосов
/ 09 февраля 2017

Ответ 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*$ может быть необязательным).

3 голосов
/ 21 сентября 2018

Также с помощью git description вы можете получить новейший тег, недоступный из HEAD, с:

git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)

2 голосов
/ 29 марта 2017

Хотя здесь достаточно одного регулярного выражения --match "v[0-9]*", знайте, что Git 2.13 (Q2 2017) улучшит это:

"git describe" и "git name-rev" научили принимать более одного паттерна refname, чтобы ограничить набор ссылок, чтобы основывать их назвав вывод, а также научился принимать негативные паттерны к Имя не может быть использовано для именования через опцию "--exclude".

См. коммит 77d21f2 , коммит 43f8080 , коммит 96415b4 , коммит 290be66 , коммит 4a68748 (18 Январь 2017) Джейкоб Келлер (jacob-keller) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 1b32498 , 27 февраля 2017 г.)

Теперь вы можете иметь комбинацию из нескольких совпадений :

--match <pattern>:

Учитывать только теги, соответствующие заданному шаблону glob(7), исключая префикс "refs / tags /".
Это можно использовать, чтобы избежать утечки личных тегов из хранилища.

Если задано несколько раз, будет сформирован список шаблонов и будут рассмотрены теги, соответствующие любому из шаблонов.
Используйте --no-match для очистки и сброса списка шаблонов.

И у вас также есть шаблон исключения (или несколько) теперь !

--exclude <pattern>::

Не учитывать теги, соответствующие заданному шаблону glob(7), за исключением префикс "refs / tags /".

Это можно использовать для сужения пространства тегов и поиска только тегов, соответствующих некоторым значимым критериям.
Если задано несколько раз, список шаблонов будет накапливаться, и теги, соответствующие любому из шаблонов, будут исключены.
В сочетании с --match тег будет учитываться, если он соответствует хотя бы одному шаблону --match и не соответствует ни одному из шаблонов --exclude.
Используйте --no-exclude для очистки и сброса списка шаблонов.

1 голос
/ 13 октября 2017

Проблема с использованием 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*

1 голос
/ 06 октября 2010
git describe --match v*

Используйте это.

0 голосов
/ 16 мая 2019

Что-то более сложное будет иметь вид:

/v[0-9]+(\.[0-9]+).*/
0 голосов
/ 07 февраля 2017

Я использую

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"

git tag интерпретирует шаблон как глобус. Таким образом, вы не можете указать полноценное регулярное выражение. Просто используйте минимальный шарик (v *) или вообще без шарика. Вы получите более одного совпадающего тега в отсортированном порядке (сначала - самая высокая версия тега), а затем сможете повторно вывести результат.

...