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

128

Мне нужен способ перечислить все теги в моей системе по дате их создания, но я не уверен, смогу ли я получить эти данные через git-log. Идеи?

Йон Урсенбах
источник
2
Вы имеете в виду, что хотите получить список всех тегов в порядке дат их создания?
lithuak 07
3
FYI (1.) Этот вопрос предназначен для перечисления АННОТИРОВАННЫХ тегов по дате. (2.) Чтобы просмотреть список LIGHTWEIGHT тегов по дате, перейдите сюда . (3.) Чтобы получить полезное напоминание о различиях между облегченными тегами Git и аннотированными тегами, перейдите сюда .
Тревор Бойд Смит
@TrevorBoydSmith: Это не совсем правильно. Разница заключается в том, что (2) перечислена все тег по фиксации даты из помеченных фиксации , в то время как эта страница дает решение, сортировать по дате маркированного (хотя только для аннотированных тегов, так как мерзавец не дата магазина помечена для легких тегов).
Дэвид П.

Ответы:

175

Сортировка по дате создания тега работает с аннотированными и облегченными тегами:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
Джош Ли
источник
12
Потрясающие. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsсделал именно то, что мне нужно. Спасибо!
Jon Ursenbach
21
Решение @DrorCohen, которое работает для легких тегов: stackoverflow.com/questions/6900328/… . Вставка здесь для удобства: git log --tags --simplify-by-decoration --pretty = "format:% ai% d"
Gilead,
5
При необходимости можно использовать %(contents)для добавления аннотаций, напримерgit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Тим Диггинс,
7
Или даже немного чище:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers 08
4
--sort=creatordateработает как для аннотированных, так и для неаннотированных тегов, но, --sort=taggerdateпохоже, работает только с аннотированными тегами. протестировано с использованиемgit version 2.16.3
Austinheiman
56

Git 2.8 (март 2016 г.) документирует еще один вариант, относящийся к git 1.4.4 (октябрь 2006 г.) .
См. Commit e914ef0 (5 января 2016 г.) Эрика Вонга ( ele828) .
(Объединено Junio ​​C Hamano - gitster- в коммите 108cb77 , 20 января 2016 г.)

Увидеть новый Documentation/git-for-each-ref.txt

Для фиксации и тегов объектов, специальные creatordateи creator поля будут соответствовать соответствующему дате или имя-адрес электронной почты на дату кортеж из committerили taggerполей в зависимости от типа объекта.
Они предназначены для работы как с аннотированными, так и с облегченными тегами .

Таким образом, использование creatordateработает с тегами:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

Или:

git tag --sort=-creatordate 

Как я подробно рассказываю в разделе « Как отсортировать теги git по порядку строк версии в форме rc-XYZW? », Вы можете добавить порядок сортировки git tag(начиная с Git 2.0 июня 2014 г.).

Этот порядок сортировки включает в себя имя поля (указанное в git for-each-ref) taggerdate . Это позволяет git tag --sort=taggerdate(упоминается DarVar ниже ).
Например, в git/gitрепо он будет указыватьv2.10.0 тег последним:

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

Порядок по умолчанию не будет ( git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0
VonC
источник
Большое спасибо. Мне было интересно, почему некоторые даты были пустыми. Я уже подозревал легковесные теги. Я рад, что мне не нужно воссоздавать теги, спасибо creatordate!
exhuma
35
git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Также приятный вывод (без поля даты):

git log --tags --decorate --simplify-by-decoration --oneline

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

git log --graph --decorate --simplify-by-decoration --oneline --all
gavenkoa
источник
Для ленивых: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"и у меня это работает лучше всего.
Mateusz
1
Обратите внимание, что это упорядочено по дате фиксации, а не по дате создания тегов. (В настоящее время) самый популярный ответ Джоша Ли упорядочен по дате создания тега.
Натаниэл Вуллс,
13
git tag --sort=-taggerdate

Согласно странице руководства, «Префикс - для сортировки в порядке убывания значения».

git tagиспользует те же ключи сортировки git-for-each-ref, что и, где ключи документированы.

Zamicol
источник
1
Вероятно, это наиболее правильный ответ на вопрос. Вот ссылка на документы, в которых описаны
prasanthv
В этом ответе не учитываются легкие теги, поскольку они имеют пустое значение "taggerdate". Другие ответы с «Creatordate» более точны.
morhook
13

Этот однострочник отображает даты и теги без каких-либо проблем.

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

Вывод:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

Если вам не нравится, как теги сортируются по умолчанию, вы можете, например, отсортировать по дате с помощью этой опции --sort=creatordate. См. Ответ VonC для более подробной информации.

elboulangero
источник
Обязан ли этот хороший метод сортировать их по дате? по возрастанию? по убыванию?
Мотти Шнеор
11

Чтобы полностью отсортировать аннотированные теги и облегченные теги на основе даты фиксации, я использую:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

Эта команда перечислит каждый тег и связанный идентификатор объекта фиксации в хронологическом порядке.

Янн Дроно
источник
Немного запутано. ... В аннотированных тегах committerdate пуст, тогда как в облегченных тегах taggerdate пуст. Таким образом, в качестве обходного пути '* committerdate' сообщает Git, что даты обратных ссылок из исходного объекта фиксации, когда он легкий. ...
ingyhere
Использование creatordate вместо этого должно эффективно делать то же самое.
ingyhere
7

С Git version 2.10.0.windows.1

git tag --sort=taggerdate

DarVar
источник
5

Следующее зависит от фиксации, поэтому не имеет значения, есть ли у нее информация о дате с фиксацией:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

Ответ Джоша Ли выше полагается на дату тега, чтобы получить правильный порядок.

Эндрю МакГлашан
источник
Не уверен, что это за команда tac- может изменить ее на more. В любом случае ваша команда сработала отлично - спасибо!
Дэвид Х
3

Основываясь на ранее упомянутых методах, я хотел также видеть фактическую дату тега в списке, поэтому моя используемая версия:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
Виль
источник