-
Star
(193)
You must be signed in to star a gist -
Fork
(42)
You must be signed in to fork a gist
-
-
Save schacon/e9e743dee2e92db9a464619b99e94eff to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # Colors | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| NO_COLOR='\033[0m' | |
| BLUE='\033[0;34m' | |
| YELLOW='\033[0;33m' | |
| NO_COLOR='\033[0m' | |
| width1=5 | |
| width2=6 | |
| width3=30 | |
| width4=20 | |
| width5=40 | |
| # Function to count commits | |
| count_commits() { | |
| local branch="$1" | |
| local base_branch="$2" | |
| local ahead_behind | |
| ahead_behind=$(git rev-list --left-right --count "$base_branch"..."$branch") | |
| echo "$ahead_behind" | |
| } | |
| # Main script | |
| main_branch=$(git rev-parse HEAD) | |
| printf "${GREEN}%-${width1}s ${RED}%-${width2}s ${BLUE}%-${width3}s ${YELLOW}%-${width4}s ${NO_COLOR}%-${width5}s\n" "Ahead" "Behind" "Branch" "Last Commit" " " | |
| # Separator line for clarity | |
| printf "${GREEN}%-${width1}s ${RED}%-${width2}s ${BLUE}%-${width3}s ${YELLOW}%-${width4}s ${NO_COLOR}%-${width5}s\n" "-----" "------" "------------------------------" "-------------------" " " | |
| format_string="%(objectname:short)@%(refname:short)@%(committerdate:relative)" | |
| IFS=$'\n' | |
| for branchdata in $(git for-each-ref --sort=-authordate --format="$format_string" refs/heads/ --no-merged); do | |
| sha=$(echo "$branchdata" | cut -d '@' -f1) | |
| branch=$(echo "$branchdata" | cut -d '@' -f2) | |
| time=$(echo "$branchdata" | cut -d '@' -f3) | |
| if [ "$branch" != "$main_branch" ]; then | |
| # Get branch description | |
| description=$(git config branch."$branch".description) | |
| # Count commits ahead and behind | |
| ahead_behind=$(count_commits "$sha" "$main_branch") | |
| ahead=$(echo "$ahead_behind" | cut -f2) | |
| behind=$(echo "$ahead_behind" | cut -f1) | |
| # Display branch info | |
| printf "${GREEN}%-${width1}s ${RED}%-${width2}s ${BLUE}%-${width3}s ${YELLOW}%-${width4}s ${NO_COLOR}%-${width5}s\n" $ahead $behind $branch "$time" "$description" | |
| fi | |
| done | |
One liner that works with git version 2.34.1 on Linux (bash, zsh), MacOS (bash, zsh), Windows (git bash, powershell inside of Windows Terminal):
git for-each-ref --color --sort=-committerdate --format='%(color: bold magenta)%(align:60,left)%(refname:short)%(color:bold red) %(upstream:track,nobracket)%(end)%(color:nobold yellow)%(align:58,left)%(committerdate:format:%Y-%d-%m %H:%M) (%(committerdate:relative), %(committerdate:format:%A %d))%(end)%(color:green)%(align:24,left)%(authorname)%(end)%(color:green)%(align:64,left)%(contents:lines=1)%(end)' refs/heads/ --count 16
It looks a little different. It shows your current branch too and sorts by most recent commit first:
It also prints gone near branch when upstream branch is unknown/gone. On Windows may output strange characters and random guids, in current shell session type powershell/bash again and all should be fine. If you modify it and wonder why alignment seems smaller than numbers say, try piping to | cat -v and you will see ANSI color escape sequences, they count too.
Adjust --count 16 to print more/less branches.
I think if [ "$branch" != "$main_branch" ] will always be True
main_branch=$(git rev-parse HEAD)will display the commit SHAbranchwill display a string, e.g.dev
because of git for-each-ref --format="$format_string", each line will be abc1234@feature/login@2 days ago, then when we parse branch=$(echo "$branchdata" | cut -d '@' -f2), so branch = feature/login
Fix: main_branch=$(git rev-parse HEAD) --> main_branch=$(git rev-parse --abbrev-ref HEAD)

@Azzam-Alotaibi Hey, i found out that cloning a repository only checkouts the default branch. This script only shows the branches you have checked out. And this script does not show the default branch.
It uses
git for-each-refcommand to get all the branches and selects the branches that starts withrefs/headsTo checkout all the remote branches at once, run this in bash:
I realized this script only uses local branches so if your branches change remotely this may not show accurate information. I need to test if this is the case.