Last active
June 13, 2022 09:51
-
-
Save AxeemHaider/9c4a1852f6c938d2e6826c3f025c0dff to your computer and use it in GitHub Desktop.
Show Git branches and status in Ubuntu Terminal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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