Ответ 1
Вы можете взглянуть на git describe
, что делает что-то близкое к тому, что вы просите.
Какой самый простой способ получить самый последний тег в Git?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
выход:
a
b
c
Должен ли я писать script, чтобы получить каждый тег datetime и сравнить их?
Вы можете взглянуть на 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
Конечно, вы можете изменить аргумент count или поле сортировки по желанию. Кажется что вы, возможно, хотели задать несколько иной вопрос, но это отвечает на вопрос, как я его интерпретирую.
Как насчет этого?
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 script, который выполняет это путем итерации по всем тегам, использующим эту проверку, а затем распечатывает тег с наименьшим количеством коммитов на 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 ...... '
ЕСЛИ ВАМ НУЖНО БОЛЬШЕ ЧЕМ ОДИН ПОСЛЕДНИЙ ТЕГ
(git описать -tags иногда дает неправильные хэши, я не знаю почему, но для меня --max-count 2 не работает)
вот как вы можете получить список с последними 2 именами тегов в обратном хронологическом порядке, отлично работает на git 1.8.4. Для более ранних версий git (например, 1.7. *) В выводе нет строки "tag:": просто удалите последний sed-вызов
Если вы хотите более двух последних тегов - измените это "sed 2q" на "sed 5q" или что вам нужно
Затем вы можете легко разобрать каждое имя тега на переменную или так.
Что означает неверно со всеми предложениями (за исключением 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
и тегомЯ не знаю, как вычислить длину кратчайшего пути.
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
на то, что вы хотите!
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
С git tag --help
, о аргументе sort
. Он будет использовать lexicorgraphic order
по умолчанию, если свойство tag.sort
не существует.
Порядок сортировки по умолчанию используется значение, настроенное для переменной tag.sort, если оно существует или лексикографический порядок в противном случае. См. git -config (1).
После google, кто-то сказал 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")
Это старый поток, но кажется, что многие люди пропускают самый простой, самый простой и самый правильный ответ на вопрос OP: чтобы получить последний тег для текущей ветки, вы используете 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