Extended GIT Information in bash PS1
This will generate shell similar to this :
Multiline version:
┌──┤ greg: ~/dev/discovery/discovery-agent │ master ≡ !1 +2 -2 ≡ 2 weeks ago └── λ
Format `branch ≡ changes additions deletions ≡ last commit`
Example `master ≡ !1 +2 -2 ≡ 2 weeks ago`
Since we are interested in interactive shells only we will edit `/etc/profile` and add the following
# Get branch name parse_git_branch() { # git branch | grep -Po '(?<=\*\s)(.*)' local branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/') # When there is no initial commit, git branch will not return any branches, use a fallback method if [ -z "$branch" ]; then branch=$(git status | grep -iPo '(?<=On branch\s)(.*)') fi echo $branch } parse_git_status() { # changes to existing files # 0 = Changed Files, 1 = Additions, 2 = Deletions local gitstat=$(git diff --shortstat 2> /dev/null | grep -Po '\d') if [ -z "$gitstat" ]; then gitstat="0 0 0" fi # replate \n with blanks gitstat=$(echo "$gitstat" | tr '\n' ' ') # untracted(??) or added(A) files local gitfiles=$(git status --untracked-files=all -s 2> /dev/null | grep -E '??|A' | wc -l) echo "$gitstat $gitfiles" } parse_git_hascommit() { val=$(git log 2> /dev/null | grep -iPo 'does not have') echo "result :: $val" if [ -z "$val" ]; then echo 0 return 0 fi echo 1 } git_status_ps1() { green_light="\e[38;5;82m" red="\e[91m" blue="\e[34m" reset="\e[0m" inrepo=$(git rev-parse --is-inside-work-tree 2>/dev/null) if [ -z "$inrepo" ]; then exit fi #hascommit=$(parse_git_hascommit) #echo "has :: $hascommit"i # can't get time unless we have a commit # capture error 'fatal: your current branch 'master' does not have any commits yet' and don't display time gittime=$(git log -1 --format=%cr 2> /dev/null) gitstat=$(parse_git_status) IFS=' ' read -r -a array <<< $gitstat if [ -z "${array[0]}" ]; then array[0]=0 array[1]=0 array[2]=0 fi branch_color=$green_light if [ "${array[0]}" -gt "0" ]; then branch_color=$red fi if [ -z "$gittime" ]; then gittime="never" fi GIT_PS1="$branch_color$(parse_git_branch) $reset ≡ $green_light ~${array[3]} !${array[0]} +${array[1]} $red-${array[2]} $reset ≡ $gittime" echo -e $GIT_PS1 } PS1='┌──┤ \[\033[01;32m\]\u:\[\033[00m\] ' PS1=$PS1'\[\033[01;34m\]\w\e[0m │ $(git_status_ps1)\n└── λ '