Мне нужен способ перечислить все теги в моей системе по дате их создания, но я не уверен, смогу ли я получить эти данные через git-log. Идеи?
Мне нужен способ перечислить все теги в моей системе по дате их создания, но я не уверен, смогу ли я получить эти данные через git-log. Идеи?
Ответы:
Сортировка по дате создания тега работает с аннотированными и облегченными тегами:
git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsсделал именно то, что мне нужно. Спасибо!
%(contents)для добавления аннотаций, напримерgit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
git for-each-ref --sort=taggerdate --format '%(tag)'
--sort=creatordateработает как для аннотированных, так и для неаннотированных тегов, но, --sort=taggerdateпохоже, работает только с аннотированными тегами. протестировано с использованиемgit version 2.16.3
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
creatordate!
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
git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"и у меня это работает лучше всего.
git tag --sort=-taggerdate
Согласно странице руководства, «Префикс - для сортировки в порядке убывания значения».
git tagиспользует те же ключи сортировки git-for-each-ref, что и, где ключи документированы.
Этот однострочник отображает даты и теги без каких-либо проблем.
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 для более подробной информации.
Чтобы полностью отсортировать аннотированные теги и облегченные теги на основе даты фиксации, я использую:
git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }'
Эта команда перечислит каждый тег и связанный идентификатор объекта фиксации в хронологическом порядке.
Следующее зависит от фиксации, поэтому не имеет значения, есть ли у нее информация о дате с фиксацией:
git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac
Ответ Джоша Ли выше полагается на дату тега, чтобы получить правильный порядок.
tac- может изменить ее на more. В любом случае ваша команда сработала отлично - спасибо!
Основываясь на ранее упомянутых методах, я хотел также видеть фактическую дату тега в списке, поэтому моя используемая версия:
git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'