Как получить последнее имя тега в текущей ветке в Git? - PullRequest
398 голосов
/ 10 сентября 2009

Какой самый простой способ получить самый последний тег в Git?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

выход:

a
b
c

Должен ли я написать скрипт для получения даты и времени каждого тега и сравнения их?

Ответы [ 19 ]

10 голосов
/ 25 февраля 2016
git tag -l ac* | tail -n1

Получить последний тег с префиксом "ac" . Например, тег с именем ac1.0.0 или ac1.0.5. Другие теги с именами 1.0.0, 1.1.0 будут игнорироваться.

git tag -l [0-9].* | tail -n1

Получить последний тег, первый символ которого равен 0-9. Таким образом, эти теги с первым символом a-z будут игнорироваться.

Подробнее

git tag --help # Help for `git tag`

git tag -l <pattern>

Список тегов с именами, которые соответствуют заданному шаблону (или все, если нет образец дан). Запуск "git tag" без аргументов также списки все теги. Шаблон является подстановочным знаком оболочки (т. Е. Сопоставляется с использованием fnmatch (3)). Может быть дано несколько шаблонов; если любой из них совпадения, тег отображается.


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

Обновление

С git tag --help, о аргументе sort. Он будет использовать lexicorgraphic order по умолчанию, если свойство tag.sort не существует.

Порядок сортировки по умолчанию используется значение, заданное для переменной tag.sort, если оно существует, или лексикографический порядок в противном случае. Смотрите git-config (1).

После Google, кто-то сказал, git 2.8.0 поддерживает следующий синтаксис.

git tag --sort=committerdate
9 голосов
/ 19 октября 2015

git describe --abbrev=0 --tags

Если вы не видите последний тег, убедитесь, что он извлекает источник до запуска:

git remote update

5 голосов
/ 22 января 2013

Следующее работает для меня, если вам нужны последние два тега (например, для создания журнала изменений между текущим тегом и предыдущим тегом). Я проверял это только в ситуации, когда последний тег был HEAD.

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

Это соответствует моим потребностям, но, поскольку я не волшебник, я уверен, что это может быть улучшено. Я также подозреваю, что он сломается, если история коммитов продвинется вперед. Я просто делюсь на случай, если это кому-нибудь поможет.

3 голосов
/ 27 апреля 2018

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

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
3 голосов
/ 10 сентября 2009

Сначала я подумал, что вы можете использовать git rev-list HEAD, который перечисляет все обороты в обратном хронологическом порядке в сочетании с git tag --contains. Когда вы найдете ссылку, где git tag --contains создает непустой список, вы нашли самые последние теги.

1 голос
/ 11 марта 2016

Это старая ветка, но, похоже, многим не хватает самого простого, простого и правильного ответа на вопрос OP: чтобы получить последний тег для текущей ветви , вы используете git describe HEAD. Готово.

Редактировать: вы также можете указать любое допустимое имя, даже удаленное; то есть git describe origin/master расскажет вам последний тег, с которым можно связаться из origin / master.

0 голосов
/ 17 мая 2018

если ваши теги сортируются:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
0 голосов
/ 26 февраля 2018

На вопрос, который задали,

Как получить последнее имя тега в текущей ветке

хочешь

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parent говорит git log не детализировать какие-либо объединенные истории, --pretty=%d говорит показывать только декорации, т.е. локальные имена для любых коммитов. grep -m1 говорит "соответствует только одному", поэтому вы получаете только самый последний тег.

0 голосов
/ 16 февраля 2018

Чтобы получить самый последний тег только для текущей ветви / имени тега, который имеет префикс текущей ветви, мне пришлось выполнить следующее

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

Мастер ветки:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

Пользовательская ветка:

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

И моя последняя потребность в увеличении и получении тега +1 для следующего тегирования.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
...