-
-
Save jasonrudolph/1810768 to your computer and use it in GitHub Desktop.
# 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 |
@ Mazorius that does not sort at all.
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.
@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
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
@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..
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 '^'
Great work. Thanks!
Great!!!. Thanks! its work for me
Thank you!
太好了,谢谢你。
That's great. Thank you
Thank you!
Thank you Jason!
Put together a different variation based on a few examples: git branch -r --sort=-committerdate --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always | column -ts'|'
Also, here's a version that works in Windows cmd and PowerShell (didn't find a good alternative for column command, but otherwise works fine): git branch -r --sort=-committerdate --format="%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)" --color=always
Is there any way to automate that extract last commit date without cloning it on local machine
Users of tig might want to use tig refs
– This outputs all local/remote branches and tags with their timestamp.
https://gist.github.com/Aniket7250 Am also looking for without cloning to get this functionality ..
Thanks!
Guys, I understand the commands that how can I list all remote/local branches along with when was it last commited, who made the last commit, last commit id, last commit message etc, sorted by committerdate .... but is there any way that I can list all branches that has their last commits within a date range ... just like we have --since
and --until
for git log
... for example, I want to list all branches that were being last commited before 6 months ago, or say, all branches that were last commited before "Jan 01 2021"
but is there any way that I can list all branches that has their last commits within a date range ... just like we have
--since
and--until
forgit log
... for example, I want to list all branches that were being last commited before 6 months ago, or say, all branches that were last commited before "Jan 01 2021"
I would like the same if possible. But, thanks for the current version as well!
Guys, I understand the commands that how can I list all remote/local branches along with when was it last commited, who made the last commit, last commit id, last commit message etc, sorted by committerdate .... but is there any way that I can list all branches that has their last commits within a date range ... just like we have
--since
and--until
forgit log
... for example, I want to list all branches that were being last commited before 6 months ago, or say, all branches that were last commited before "Jan 01 2021"
Yes, it's possible. Here's some information on comparing dates in Bash scripts, you'd want to extract the dates from the git output line-by-line, convert them from text to a comparable date format, and compare against your target date to know whether to display them or not:
https://unix.stackexchange.com/questions/84381/how-to-compare-two-dates-in-a-shell
but is there any way that I can list all branches that has their last commits within a date range ... just like we have
--since
and--until
forgit log
... for example, I want to list all branches that were being last commited before 6 months ago, or say, all branches that were last commited before "Jan 01 2021"I would like the same if possible. But, thanks for the current version as well!
See comment above.
Thanks for this
thx man 👍
Another way to do this via gitconfig aliases:
You can use the command below if you want to filter the branches that were updated X - days ago.
git branch -r --format="%(committerdate:iso8601), %(committerdate:relative) - %(refname:short)" | grep -v [H]EAD | awk -v dateA="$(date -d "$(date +%Y-%m-%d) - 3 days" +%Y-%m-%d)" -F '|' 'dateA<=$1" "$2' | awk -F '/' '{ print $NF }'
From the above command replace the 3 days with your X no of days
Here's my version of this.
# Credit https://gist.github.com/jasonrudolph/1810768
# Credit http://stackoverflow.com/a/2514279
for branch in `git branch -r | grep -v HEAD`;
do printf "%-40s\\t%20s\\n" $branch "`git show --format="%ci %cr" $branch | head -n 1`";
done | sort -k 2
Here's a version sorting by committer date, including colour formatting, that is easy to add as a git alias:
❯ git branch -a --sort=-creatordate --format='%(color:red)%(committerdate:iso8601)%(color:reset) %(align:8)(%(ahead-behind:HEAD))%(end) %(color:blue)%(align:40)%(refname:short)%(end)%(color:reset) %(color:white)%(contents:subject) %(color:yellow)(%(committerdate:relative))%(color:reset)'
Example output:
Git aliases:
[alias]
br = "branch --format='%(color:red)%(committerdate:iso8601)%(color:reset) %(align:8)(%(ahead-behind:HEAD))%(end) %(color:blue)%(align:40)%(refname:short)%(end)%(color:reset) %(color:white)%(contents:subject) %(color:yellow)(%(committerdate:relative))%(color:reset)' --sort=-creatordate"
newestb = "br --sort=-committerdate"
oldestb = "br --sort=committerdate"
It can then be composed with other flags like -r
, -a
, --merged=main
, etc.
@bjeanes this looks really nice but I get this error:
fatal: unknown field name: ahead-behind:HEAD
woow, thx