Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
List remote Git branches and the last commit date for each branch. Sort by most recent commit date.
# Credit http://stackoverflow.com/a/2514279
for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r
# Example output (resulting from running command on the Rails repo — https://github.com/rails/rails)
2012-02-12 03:20:24 -0800 9 hours ago origin/master
2012-02-10 10:34:35 -0800 2 days ago origin/3-2-stable
2012-01-31 09:56:12 -0800 12 days ago origin/3-1-stable
2012-01-24 11:18:06 -0800 3 weeks ago origin/3-0-stable
2011-12-31 05:09:14 -0800 6 weeks ago origin/2-3-stable
2011-11-25 09:49:54 +0000 3 months ago origin/serializers
2011-06-16 12:08:26 -0700 8 months ago origin/compressor
2011-05-24 16:03:41 -0700 9 months ago origin/sass-cleanup
2011-01-17 14:14:24 +1300 1 year, 1 month ago origin/2-1-stable
2011-01-17 14:13:56 +1300 1 year, 1 month ago origin/2-2-stable
2010-08-17 17:11:17 -0700 1 year, 6 months ago origin/deps_refactor
2010-05-16 22:23:44 +0200 1 year, 9 months ago origin/encoding
2009-09-10 17:41:18 -0700 2 years, 5 months ago origin/2-0-stable
2008-02-19 02:09:55 +0000 4 years ago origin/1-2-stable
@AABoyles

This comment has been minimized.

Copy link

@AABoyles AABoyles commented May 17, 2013

Nice! Thanks a lot!

@bryancdickson

This comment has been minimized.

Copy link

@bryancdickson bryancdickson commented Jul 31, 2013

well done. Saved me lots of work.

@softwaregravy

This comment has been minimized.

Copy link

@softwaregravy softwaregravy commented Jan 24, 2014

thanks

@awienber

This comment has been minimized.

Copy link

@awienber awienber commented Mar 20, 2014

thanks! and first calling "git remote prune origin" helps to only show the branches still existing in the remote repo.

@FrozenCow

This comment has been minimized.

Copy link

@FrozenCow FrozenCow commented Apr 7, 2014

I also wanted local branches to show up, but when changing git branch -r to git branch -a things get messy due to the * that is suffixed to HEAD. After some searching I came up with a single command that has very similar results:

git for-each-ref --format='%(committerdate:iso8601) %(committerdate:relative) %(refname)' --sort -committerdate

Note that this shows heads, remotes and tags. If you only want heads you could use:

git for-each-ref --format='%(committerdate:iso8601) %(committerdate:relative) %(refname)' --sort -committerdate refs/heads/
@Diom

This comment has been minimized.

Copy link

@Diom Diom commented Sep 16, 2014

@FrozenCow If you want to avoid the asterix problem then you can do

for branch in `git branch -l | grep -v '*'`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r

But it will leave out your current branch.

@allantokuda

This comment has been minimized.

Copy link

@allantokuda allantokuda commented Oct 18, 2014

Adding to @FrozenCow, you can make the results tabular with the column utility:

git for-each-ref --format='%(committerdate:short),%(authorname),%(refname:short)' --sort=committerdate refs/heads/ | column -t -s ','
@triage

This comment has been minimized.

Copy link

@triage triage commented Jan 31, 2015

thank you!

@eksperimental

This comment has been minimized.

Copy link

@eksperimental eksperimental commented Feb 11, 2015

I think this one has been updated, using colors with pretty format.

for k in `git branch -r | perl -pe 's/^..(.*?)( ->.*)?$/\1/'`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
@liuyu121

This comment has been minimized.

Copy link

@liuyu121 liuyu121 commented Aug 28, 2015

thx u so much and, thanks @eksperimental

@stuartgmilton

This comment has been minimized.

Copy link

@stuartgmilton stuartgmilton commented Jun 21, 2016

Is it possible to include the creator of the branch?

@jampow

This comment has been minimized.

Copy link

@jampow jampow commented Jul 20, 2016

based on this posts and this stackoverflow topic. I made this command

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:red)%(objectname:short)%(color:reset);%(color:yellow)%(refname:short)%(color:reset);(%(color:green)%(committerdate:relative)%(color:reset));%(authorname);%(contents:subject)' | column -t -s ';'

@michaelwills

This comment has been minimized.

Copy link

@michaelwills michaelwills commented Aug 11, 2016

@jampow 👍

@jasonrudolph thanks for the original inspiration!

@arulthayalan

This comment has been minimized.

Copy link

@arulthayalan arulthayalan commented Nov 9, 2016

Thank you!!!

@windse7en

This comment has been minimized.

Copy link

@windse7en windse7en commented Mar 15, 2017

Thanks. Nice work.

@auerbachb

This comment has been minimized.

Copy link

@auerbachb auerbachb commented May 15, 2017

anyone know how to truncate within this?

git for-each-ref --sort=committerdate refs/heads/ --format='%(color:yellow)%(refname:short)%(color:reset);(%(color:green)%(committerdate:relative)%(color:reset));%<(70,trunc)(%(contents:subject)%s)' | column -t -s';'```
prints the `%<(70,trunc)` rather than applying it.
@juanmf

This comment has been minimized.

Copy link

@juanmf juanmf commented Oct 4, 2017

This will sort most recently updated 1st.

git branch -r --sort=-committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))' | grep <remote|author>
@igbanam

This comment has been minimized.

Copy link

@igbanam igbanam commented Jan 16, 2018

Awesome 👍

@igbanam

This comment has been minimized.

Copy link

@igbanam igbanam commented Jan 16, 2018

@juanmf thanks for showing this in a readable format. It's easier to add this as an alias

@binarybasher

This comment has been minimized.

Copy link

@binarybasher binarybasher commented Mar 5, 2018

Awesome 👍 , thanks @jasonrudolph

@sarelvdwalt

This comment has been minimized.

Copy link

@sarelvdwalt sarelvdwalt commented Mar 11, 2018

Perhaps use this to remove "origin/" from the mix... makes it easier to quickly copy & paste what remote branches to delete:

for branch in git branch -r --merged | grep -v HEAD; do echo -e git show --format="%ci %cr %an" $branch | head -n 1 \t$branch; done | sed -e 's/[[:blank:]]origin///g' | sort -r

@jknipp

This comment has been minimized.

Copy link

@jknipp jknipp commented May 7, 2018

👍

@forpix

This comment has been minimized.

Copy link

@forpix forpix commented Jul 24, 2018

Thank You bro. @juanmf, finally cracked the my requirement with your code

@tomas

This comment has been minimized.

Copy link

@tomas tomas commented Aug 14, 2018

Here's my take:

git branch -r | grep -v HEAD | while read b; do git log --color --format="%ci _%C(magenta)%cr %C(bold cyan)$b%Creset %s %C(bold blue)<%an>%Creset" $b | head -n 1; done | sort -r | cut -d_ -f2- | sed 's;origin/;;g' | head -10

No backticks required, and uses git log which is somewhat faster than git show on my PC. Output looks like this:

image

To use it in .gitignore the quotes need to be escaped, like this:

  updated_branches = "!f() { git fetch && git branch -r | grep -v HEAD | while read b; do git log --color --format=\"%ci _%C(magenta)%cr %C(bold cyan)$b%Creset %s %C(bold blue)<%an>%Creset\" $b | head -n 1; done | sort -r | cut -d_ -f2- | sed 's;origin/;;g' | head -10; }; f"

Hope it helps! I'm planning to add something similar to a native command line Git client I'm working on (tomas.github.io/jix).

@Mazorius

This comment has been minimized.

Copy link

@Mazorius Mazorius commented Dec 7, 2018

For branches you can use this one:

Use -a for local and remote branches, -r for remote only and -l for local only

git branch -[a,l,r] --format="%(committerdate:iso8601), %(committerdate:relative) - %(refname:short)" | grep -v [H]EAD
@drshiki

This comment has been minimized.

Copy link

@drshiki drshiki commented Mar 13, 2019

woow, thx

@gerroon

This comment has been minimized.

Copy link

@gerroon gerroon commented May 4, 2019

@ Mazorius that does not sort at all.

@roschler

This comment has been minimized.

Copy link

@roschler roschler commented Jul 26, 2019

Is there a way to always get the date instead of the "X days ago" being used for recent dates? I really don't like that "adaptive" format and just want to see the dates. @Mazorius has the format I want for the dates, but it doesn't sort, so I'm hoping to get the best of both worlds.

@Mazorius

This comment has been minimized.

Copy link

@Mazorius Mazorius commented Jul 27, 2019

@gerroon & @roschler: You have to use the sort program to get the sorting by age.

Use -a for local and remote branches, -r for remote only and -l for local only

git branch -[a,l,r] --format="%(committerdate:iso8601), %(committerdate:relative) - %(refname:short)" | grep -v [H]EAD | sort

recursive

git branch -[a,l,r] --format="%(committerdate:iso8601), %(committerdate:relative) - %(refname:short)" | grep -v [H]EAD | sort -r
@tXambe

This comment has been minimized.

Copy link

@tXambe tXambe commented Sep 26, 2019

Hello,
How I can execute this script at external repo, for example:

./git-branches-by-commit-date.sh http://github.com/my_repo

Thanks and a greeting

@fazl

This comment has been minimized.

Copy link

@fazl fazl commented Dec 5, 2019

@tXambe Sorry I didn't have time to look into changing the script to take that parameter - but a quick workaround could be to simply first checkout your repo to your local machine then run the script (without your argument) from inside the repo. Hope it helps..

@danyill

This comment has been minimized.

Copy link

@danyill danyill commented Jan 24, 2020

Using awk to truncate the commit message but otherwise re-using from above with colour and columns:

  git branch -r | grep -v HEAD | while read b; do git log --color --format="%ci _%C(magenta) %cr^ %C(bold cyan)$b%Creset^ %s^ %C(bold blue)%an%Creset" $b | head -n 1; done | sort -r | cut -d_ -f2- | sed 's;origin/;;g' | awk -F^ -vOFS=^ 'NR{$3=substr($3,1,60)}1' | head -10 | column -t -s '^'
@mrvincenzo

This comment has been minimized.

Copy link

@mrvincenzo mrvincenzo commented Mar 22, 2020

Great work. Thanks!

@NicolasErices

This comment has been minimized.

Copy link

@NicolasErices NicolasErices commented Jun 17, 2020

Great!!!. Thanks! its work for me

@vthanki

This comment has been minimized.

Copy link

@vthanki vthanki commented Jul 6, 2020

Thank you!

@lichongchong

This comment has been minimized.

Copy link

@lichongchong lichongchong commented Aug 12, 2020

太好了,谢谢你。
That's great. Thank you

@vishalbasra

This comment has been minimized.

Copy link

@vishalbasra vishalbasra commented Sep 14, 2020

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.