How can I list all tags in my Git repository by the date they were created?

Git

Git 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*'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJon UrsenbachView Question on Stackoverflow
Solution 1 - GitJosh LeeView Answer on Stackoverflow
Solution 2 - GitVonCView Answer on Stackoverflow
Solution 3 - GitgavenkoaView Answer on Stackoverflow
Solution 4 - GitelboulangeroView Answer on Stackoverflow
Solution 5 - GitZamicolView Answer on Stackoverflow
Solution 6 - GitYann DroneaudView Answer on Stackoverflow
Solution 7 - GitDarVarView Answer on Stackoverflow
Solution 8 - GitAndrew McGlashanView Answer on Stackoverflow
Solution 9 - GitVilleView Answer on Stackoverflow
Solution 10 - GitGabriel StaplesView Answer on Stackoverflow