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 commented May 17, 2013

Nice! Thanks a lot!

@bryancdickson

This comment has been minimized.

Copy link

bryancdickson commented Jul 31, 2013

well done. Saved me lots of work.

@softwaregravy

This comment has been minimized.

Copy link

softwaregravy commented Jan 24, 2014

thanks

@awienber

This comment has been minimized.

Copy link

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 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 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 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 commented Jan 31, 2015

thank you!

@eksperimental

This comment has been minimized.

Copy link

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 commented Aug 28, 2015

thx u so much and, thanks @eksperimental

@stuartgmilton

This comment has been minimized.

Copy link

stuartgmilton commented Jun 21, 2016

Is it possible to include the creator of the branch?

@jampow

This comment has been minimized.

Copy link

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 commented Aug 11, 2016

@jampow 👍

@jasonrudolph thanks for the original inspiration!

@arulthayalan

This comment has been minimized.

Copy link

arulthayalan commented Nov 9, 2016

Thank you!!!

@windse7en

This comment has been minimized.

Copy link

windse7en commented Mar 15, 2017

Thanks. Nice work.

@auerbachb

This comment has been minimized.

Copy link

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 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 commented Jan 16, 2018

Awesome 👍

@igbanam

This comment has been minimized.

Copy link

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 commented Mar 5, 2018

Awesome 👍 , thanks @jasonrudolph

@sarelvdwalt

This comment has been minimized.

Copy link

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 commented May 7, 2018

👍

@forpix

This comment has been minimized.

Copy link

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 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 commented Dec 7, 2018

For branches you can use this one:

git branch -avv --format="%(committerdate:iso8601), %(committerdate:relative) - %(refname:short)"
@drshiki

This comment has been minimized.

Copy link

drshiki commented Mar 13, 2019

woow, thx

@gerroon

This comment has been minimized.

Copy link

gerroon commented May 4, 2019

@ Mazorius that does not sort at all.

@roschler

This comment has been minimized.

Copy link

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 commented Jul 27, 2019

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

git branch -avv --format="%(committerdate:iso8601), %(committerdate:relative) - %(refname:short)" | sort
@tXambe

This comment has been minimized.

Copy link

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

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.