How can I list all tags in my Git repository by the date they were created?
GitGit Problem Overview
I need some way to list all tags in my system by the date they were created but am not sure if I can get that data via git-log. Ideas?
Git Solutions
Solution 1 - Git
Sorting by tag creation date works with annotated and lightweight tags:
git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
Solution 2 - Git
Git 2.8 (March 2016) documents another option dating back to git 1.4.4 (Oct2006).
See commit e914ef0 (05 Jan 2016) by Eric Wong (ele828
).
(Merged by Junio C Hamano -- gitster
-- in commit 108cb77, 20 Jan 2016)
See the new Documentation/git-for-each-ref.txt
> For commit and tag objects, the special creatordate
and creator
fields will correspond to the appropriate date or name-email-date tuple
from the committer
or tagger
fields depending on the object type.
These are intended for working on a mix of annotated and lightweight tags.
So using creatordate
works with tags:
git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }'
Or:
git tag --sort=-creatordate
As I detail in "How to sort git tags by version string order of form rc-X.Y.Z.W?", you can add a sort order to git tag
(since Git 2.0 June 2014).
That sort order includes as field name (listed in git for-each-ref
) taggerdate. That allows for git tag --sort=taggerdate
(mentioned by DarVar below)
As an example, in the git/git
repo it will list the v2.10.0
tag last:
v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0
The default order would not (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
Solution 3 - Git
git log --tags --simplify-by-decoration --pretty="format:%ci %d"
Also nice output from (without date field):
git log --tags --decorate --simplify-by-decoration --oneline
To see full history with dependencies and striped linear commits (only essential events, like tagging and branching/merging):
git log --graph --decorate --simplify-by-decoration --oneline --all
Solution 4 - Git
This one-liner displays dates & tags:
git tag --format='%(creatordate:short)%09%(refname:strip=2)'
Output:
2015-09-27 v0.1.0
2019-10-22 v0.10.0
2020-07-08 v0.12.0
2015-11-18 v0.2.0
2020-12-08 v1.0.0
Tags are sorted in lexicographic order by default. If you prefer to sort by date:
git tag --format='%(creatordate:short)%09%(refname:strip=2)' --sort=creatordate
Output:
2015-09-27 v0.1.0
2015-11-18 v0.2.0
2019-10-22 v0.10.0
2020-07-08 v0.12.0
2020-12-08 v1.0.0
See VonC answer for more details.
Solution 5 - Git
git tag --sort=-taggerdate
According to the man page, "Prefix - to sort in descending order of the value. "
git tag
uses the same sorting keys as git-for-each-ref
, which is where the keys are documented.
Solution 6 - Git
To have annotated tags and lightweight tags sorted altogether, based on the commit date, I'm using:
git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }'
This command will list every tag and the associated commit object id, in chronological order.
Solution 7 - Git
With Git version 2.10.0.windows.1
git tag --sort=taggerdate
Solution 8 - Git
The following relies on the commit, so it doesn't matter if it has date information with the commit:
git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac
The answer above by Josh Lee, relies on a tag date to get the order correct.
Solution 9 - Git
Building on the earlier mentioned methods, I wanted to also see the actual tag date on the list, and so my in-use version is:
git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
Solution 10 - Git
Note: my git --version
is git version 2.25.1
.
For a list -l
of all tags, with up to 99 lines in the message field per tag (-n99
), in chronological order with the newest tag last, do:
git tag -l -n99 --sort=taggerdate
(My preferred form) to reverse the chronological order and put the newest tag first, add a minus sign (-
) in front of taggerdate
, like this:
git tag -l -n99 --sort=-taggerdate
Going further:
To also search within the tags and only show tags which contain string my string
somewhere in their name, add '*my string*'
to the end. Note that the asterisks (*
) are wild-cards in the search pattern:
git tag -l -n99 --sort=-taggerdate '*my string*'
To only show the tag names, and NOT up to 99 lines of their tag messages, simply remove the -n99
part:
git tag -l --sort=-taggerdate '*my string*'