Skip to content

Instantly share code, notes, and snippets.

@AxeemHaider
Last active June 13, 2022 09:51
Show Gist options
  • Save AxeemHaider/9c4a1852f6c938d2e6826c3f025c0dff to your computer and use it in GitHub Desktop.
Save AxeemHaider/9c4a1852f6c938d2e6826c3f025c0dff to your computer and use it in GitHub Desktop.
Show Git branches and status in Ubuntu Terminal
# Adds the current branch to the bash prompt when the working directory is
# part of a Git repository. Includes color-coding and indicators to quickly
# indicate the status of working directory.
git_branch() {
# -- Finds and outputs the current branch name by parsing the list of
# all branches
# -- Current branch is identified by an asterisk at the beginning
# -- If not in a Git repository, error message goes to /dev/null and
# no output is produced
git branch --no-color 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
git_status() {
# Outputs a series of indicators based on the status of the
# working directory:
# + changes are staged and ready to commit
# ! unstaged changes are present
# ? untracked files are present
# S changes have been stashed
# P local commits need to be pushed to the remote
local status="$(git status --porcelain 2>/dev/null)"
local output=''
[[ -n $(egrep '^[MADRC]' <<<"$status") ]] && output="$output+"
[[ -n $(egrep '^.[MD]' <<<"$status") ]] && output="$output!"
[[ -n $(egrep '^\?\?' <<<"$status") ]] && output="$output?"
[[ -n $(git stash list) ]] && output="${output}S"
[[ -n $(git log --branches --not --remotes) ]] && output="${output}P"
[[ -n $output ]] && output="|$output" # separate from branch name
echo $output
}
git_color() {
# Receives output of git_status as argument; produces appropriate color
# code based on status of working directory:
# - White if everything is clean
# - Green if all changes are staged
# - Red if there are uncommitted changes with nothing staged
# - Yellow if there are both staged and unstaged changes
# MAGENTA="\[\033[0;35m\]"
# YELLOW="\[\033[01;33m\]"
# BLUE="\[\033[00;34m\]"
# LIGHT_GRAY="\[\033[0;37m\]"
# CYAN="\[\033[0;36m\]"
# GREEN="\[\033[00;32m\]"
# RED="\[\033[0;31m\]"
# VIOLET='\[\033[01;35m\]'
local staged=$([[ $1 =~ \+ ]] && echo yes)
local dirty=$([[ $1 =~ [!\?] ]] && echo yes)
if [[ -n $staged ]] && [[ -n $dirty ]]; then
echo -e '\033[1;33m' # bold yellow
elif [[ -n $staged ]]; then
echo -e '\033[1;32m' # bold green
elif [[ -n $dirty ]]; then
echo -e '\033[1;31m' # bold red
else
echo -e '\033[1;35m' # bold MAGENTA
fi
}
git_prompt() {
# First, get the branch name...
local branch=$(git_branch)
# Empty output? Then we're not in a Git repository, so bypass the rest
# of the function, producing no output
if [[ -n $branch ]]; then
local state=$(git_status)
local color=$(git_color $state)
# Now output the actual code to insert the branch and status
echo -e " \x01$color\x02[$branch$state]\x01\033[00m\x02 " # last bit resets color
fi
}
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(git_prompt)\$ '
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment