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

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

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

выход:

a
b
c

Должен ли я писать script, чтобы получить каждый тег datetime и сравнить их?

Ответы

Ответ 1

Вы можете взглянуть на git describe, что делает что-то близкое к тому, что вы просите.

Ответ 2

Чтобы получить самый последний тег:

git describe --tags

Чтобы получить самый последний аннотированный тег:

git describe --abbrev=0

Ответ 3

Выведет тег последнего помеченного фиксации во всех ветвях

git describe --tags $(git rev-list --tags --max-count=1)

Ответ 4

Чтобы получить последний тег, вы можете:

$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1

Конечно, вы можете изменить аргумент count или поле сортировки по желанию. Кажется что вы, возможно, хотели задать несколько иной вопрос, но это отвечает на вопрос, как я его интерпретирую.

Ответ 5

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

TAG=$(git describe $(git rev-list --tags --max-count=1))

Технически, не обязательно вы получите последний тег, но последний фиксатор, который помечен, что может или не может быть тем, что вы ищете.

Ответ 6

git describe --tags

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

Ответ 7

"Самое последнее" может иметь два значения в терминах git.

Вы могли бы означать, "у какого тега есть дата создания последней по времени", и большинство ответов здесь для этого вопроса. По вашему вопросу вы хотели бы вернуть тег c.

Или вы могли бы означать, "какой тег наиболее близок в истории развития к какой-либо именованной ветке", обычно к ветке, на которой вы находитесь, HEAD. В вашем вопросе это вернет тег a.

Это могут быть разные, конечно:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

Представьте тег разработчика Z как v0.2 в понедельник, а затем пометьте Q как v0.1 во вторник. v0.1 является более поздним, но v0.2 ближе в истории развития к HEAD, в том смысле, что путь, который он запускает, начинается в точке, ближе к HEAD.

Я думаю, что вам обычно нужен этот второй ответ, ближе к истории развития. Вы можете найти это, используя git log v0.2..HEAD и т.д. Для каждого тега. Это дает вам количество коммитов на HEAD, так как путь, заканчивающийся на v0.2, отклоняется от пути, за которым следует HEAD.

Здесь Python script, который выполняет это путем итерации по всем тегам, использующим эту проверку, а затем распечатывает тег с наименьшим количеством коммитов на HEAD, так как путь тега расходится:

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describe делает что-то немного другое, в том, что он отслеживает (например,) HEAD, чтобы найти первый тег, который находится на пути назад в истории из HEAD. В терминах git git describe ищет теги, которые "достижимы" из HEAD. Поэтому он не найдет теги типа v0.2, которые не находятся на пути назад от HEAD, но путь, который от него отходит.

Ответ 9

git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed   ......  '

ЕСЛИ ВАМ НУЖНО БОЛЬШЕ ЧЕМ ОДИН ПОСЛЕДНИЙ ТЕГ

(git описать -tags иногда дает неправильные хэши, я не знаю почему, но для меня --max-count 2 не работает)

вот как вы можете получить список с последними 2 именами тегов в обратном хронологическом порядке, отлично работает на git 1.8.4. Для более ранних версий git (например, 1.7. *) В выводе нет строки "tag:": просто удалите последний sed-вызов

Если вы хотите более двух последних тегов - измените это "sed 2q" на "sed 5q" или что вам нужно

Затем вы можете легко разобрать каждое имя тега на переменную или так.

Ответ 10

Что означает неверно со всеми предложениями (за исключением Matthew Brett, до настоящего момента ответа)?

Просто запустите любую команду, предоставленную другим в истории jQuery Git, когда вы в другой точке истории и проверите результат с представлением истории визуальной маркировки (I сделал), которая почему вы видите этот пост):

$ git log --graph --all --decorate --oneline --simplify-by-decoration

Сегодня многие проекты выполняют выпуски (и поэтому помечены) в отдельной ветке от mainline.

Для этого существует сильная причина. Посмотрите на все хорошо разработанные проекты JS/CSS. Для пользовательских соглашений они несут файлы с двоичным/мини-выпуском в DVCS. Естественно, что в качестве поддерживающего проект вы не хотите мусорной истории вашей основной истории с бесполезными двоичными блоками и выполнять фиксацию артефактов сборки из mainline.

Поскольку Git использует DAG, а не линейную историю - трудно определить метрику расстояния, поэтому мы можем сказать - о, что rev наиболее близок к моему HEAD!

Я начинаю свое путешествие (загляните внутрь, я не копировал причудливые изображения на этот длинный пост):

Каков ближайший тег в прошлом относительно ветвления в Git?

В настоящее время у меня есть 4 разумных определения расстояния между тегом и ревизией с уменьшением полезности:

  • длина кратчайшего пути из HEAD для объединения базы с тегом
  • дата базы слияния между HEAD и тегом
  • количество оборотов, доступное из HEAD, но недоступное из тега
  • дата тега независимо от базы слияния

Я не знаю, как вычислить длину кратчайшего пути.

Script, которые сортируют теги в соответствии с датой базы слияния между HEAD и тегом:

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

Он может использоваться для большинства проектов.

Script, которые сортируют теги в соответствии с числом оборотов, доступным из HEAD, но недоступным из тега:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

Если у вашей истории проекта есть странные даты на фиксации (из-за пересогласования или другой перезаписи истории или какого-нибудь придурка забыть заменить батарею BIOS или другую магию, что вы делаете в истории) используйте выше script.

Для последней опции ( date тега независимо от базы слияния), чтобы получить список отсортированных по дате тегов:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

Чтобы узнать текущую дату использования, используйте:

$ git log --max-count=1

Обратите внимание, что git describe --tags имеет использование в своих собственных случаях, но не для поиска ожидаемого ближайшего тега человека в истории проекта.

ПРИМЕЧАНИЕ Вы можете использовать вышеуказанные рецепты в любой редакции, просто замените HEAD на то, что вы хотите!

Ответ 11

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

Получить последний тег, первый char - 0-9. Таким образом, те теги с первым char 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 

Update

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

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

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

git tag --sort=committerdate

Ответ 12

git describe --abbrev=0 --tags

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

git remote update

Ответ 13

Для меня нужны два последних тега (например, для создания журнала изменений между текущим тегом и предыдущим тегом). Я тестировал его только в ситуации, когда последним тегом был 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_"`

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

Ответ 14

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

Ответ 15

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

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

Ответ 16

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

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

Ответ 17

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

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}'

Ответ 18

На вопрос, как задано,

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

ты хочешь

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

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

Ответ 19

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

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1