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

StackOverflow https://stackoverflow.com/questions/1404796

Вопрос

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

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

выход:

a
b
c

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

Это было полезно?

Решение

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

Другие советы

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

git describe --tags

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

git describe --abbrev=0

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

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

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

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

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

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

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

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

git describe --tags

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

«Самый последний» может иметь два значения с точки зрения 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, который делает это, перебирая все теги, выполняющие эту проверку, а затем распечатывая тег с наименьшим количеством коммитов в HEAD, поскольку путь к тегу разошелся:

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

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

Вы можете выполнить: git describe --tags $(git rev-list --tags --max-count=1) говорили здесь: Как получить последнее имя тега?

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

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

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

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

Если вам нужно более двух последних тегов — измените «sed 2q» на «sed 5q» или что вам нужно.

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

Что неправильный со всеми предложениями (кроме Мэтью Бретт объяснение, актуальное для этого поста с ответом)?

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

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

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

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

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

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

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

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

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

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

Скрипт, который сортирует теги по дата из объединить базу между HEAD и тег:

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

Его можно использовать в большинстве проектов.

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

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

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

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

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

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

$ git log --max-count=1

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

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

git tag -l ac* | tail -n1

Получить последний тег с префиксом "ак".Например, тег с именем 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 собственности не существует.

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

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

git tag --sort=committerdate

git describe --abbrev=0 --tags

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

git remote update

Следующее работает для меня, если вам нужны последние два тега (например, для создания журнала изменений между текущим тегом и предыдущим тегом).Я тестировал это только в ситуации, когда последний тег был 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, я уверен, что его можно улучшить.Я также подозреваю, что он сломается, если история коммитов продолжится.Я просто делюсь, на случай, если это кому-то поможет.

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

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

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

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

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

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

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

По заданному вопросу,

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

вы хотите

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

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

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

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top