Список git тегов, дат и сообщений

Как мне указать имя тега, дату тега и тег для всех тегов?

Кажется, что разделение логики отображения git для совершения транзакций через git log и тегов через git tag затрудняет список имени тега, даты тега и сообщения тега.

Я могу показать дату, имя и сообщение тега, используя git log --tags --show-notes --simplify-by-decoration --pretty="format:%ai %d %s"

Я проверил http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/pretty-formats.txt, но не увидел никакой возможности показывать сообщение тега.

Я могу показать имя тега и 5 строк сообщения тега, используя git tag -n5.

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

Ответы

Ответ 1

Вы хотите использовать команду for-each-ref. К сожалению, он немного менее удобен для пользователя, чем filter-branch

Обратите внимание, что информация, такая как дата тега и теггер, доступна только для аннотированных тегов.

Ниже представлен базовый прототип. Обратите внимание, что формат = может быть полной оболочкой script и, вероятно, должен зависеть от того, насколько сложным вы хотите выход. У них есть несколько примеров, специально предназначенных для тегов в документации для каждого документа

git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags

Ответ 2

git show --tags, по крайней мере, выведет всю необходимую информацию о ваших тегах. Возможно, вы сможете найти подходящую последовательность --pretty=format:.

Ответ 3

Я не знаю, есть ли способ

укажите только тег, тег и тег для всех тегов используя только синтаксис git.

Но простой grep выполнит эту задачу:

git show --tags |grep "^tag " -A4

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

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

git show --tags |awk "/^tag /,/-----BEGIN PGP SIGNATURE-----|commit /" |egrep -v "^$" |sed -E "s/^-----BEGIN PGP SIGNATURE-----.*|^commit.*/-/"

Это будет работать до тех пор, пока за сообщением тега следует либо подпись PGP SIGNATURE, либо сообщение фиксации, что afaik - все возможные ситуации. Однако вы можете легко адаптировать последний grep для покрытия других ситуаций (если они были).

Ответ 4

Это скорее следующий вопрос к ответу Эндрю, немного другая, но связанная с этим тема.

git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags

Это отлично работает в прямой командной строке. Когда я устанавливаю псевдоним git в ~/.gitconfig, он, похоже, не выводит один и тот же вывод.

При непосредственном вызове в командной строке я получаю.

package-release-14.7.2 ср. 3 дек. 14:24:38 2014 -0800 14.7.2: копия для тега package-release-14.7.2
package-release-14.7.3 Чт. 4 декабря 14:14:55 2014 -0800 14.7.3: копия для тега package-release-14.7.3
Пакет-релиз-14.7.4 Пятница 5 декабря 16:16:40 2014 -0800 14.7.4: копия для тега package-release-14.7.4

И когда я вызываю псевдоним git (taghist = for-each-ref -format = "% (refname: short)% (taggerdate)% (subject)% (body)" refs/tags), я получить

package-release-14.7.2
пакет-релиз-14.7.3
пакет-релиз-14.7.4

-San