Skip to content

Instantly share code, notes, and snippets.

@schacon
Created January 13, 2024 18:41
Show Gist options
  • Save schacon/e9e743dee2e92db9a464619b99e94eff to your computer and use it in GitHub Desktop.
Save schacon/e9e743dee2e92db9a464619b99e94eff to your computer and use it in GitHub Desktop.

Revisions

  1. schacon created this gist Jan 13, 2024.
    56 changes: 56 additions & 0 deletions better-git-branch.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,56 @@
    #!/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