Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Show Git dirty status in your Unix bash prompt (symbols not compatible with CygWin)
RED="\[\033[0;31m\]"
YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
BLUE="\[\033[0;34m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_GREEN="\[\033[1;32m\]"
WHITE="\[\033[1;37m\]"
LIGHT_GRAY="\[\033[0;37m\]"
COLOR_NONE="\[\e[0m\]"
function parse_git_branch {
git rev-parse --git-dir &> /dev/null
git_status="$(git status 2> /dev/null)"
branch_pattern="^# On branch ([^${IFS}]*)"
remote_pattern="# Your branch is (.*) of"
diverge_pattern="# Your branch and (.*) have diverged"
if [[ ! ${git_status} =~ "working directory clean" ]]; then
state="${RED}"
fi
# add an else if or two here if you want to get more specific
if [[ ${git_status} =~ ${remote_pattern} ]]; then
if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then
remote="${YELLOW}"
else
remote="${YELLOW}"
fi
fi
if [[ ${git_status} =~ ${diverge_pattern} ]]; then
remote="${YELLOW}"
fi
if [[ ${git_status} =~ ${branch_pattern} ]]; then
branch=${BASH_REMATCH[1]}
echo " (${branch})${remote}${state}"
fi
}
function prompt_func() {
previous_return_value=$?;
# prompt="${TITLEBAR}$BLUE[$RED\w$GREEN$(__git_ps1)$YELLOW$(git_dirty_flag)$BLUE]$COLOR_NONE "
prompt="${TITLEBAR}${BLUE}[${RED}\w${GREEN}$(parse_git_branch)${BLUE}]${COLOR_NONE} "
if test $previous_return_value -eq 0
then
PS1="${prompt}"
else
PS1="${prompt}${RED}${COLOR_NONE} "
fi
}
PROMPT_COMMAND=prompt_func
@jonstefansson
Copy link

jonstefansson commented Sep 14, 2010

I source'd this on my Mac and got gistfile1.sh: line 11: syntax error near unexpected token `{. When I opened the file in TextMate, I noticed the line endings were CRLF (Windows). I saved the file with LF and was able to execute the script. I think this may be very helpful. Thanks. See you at NFJS in Redmond!

@LightGuard
Copy link

LightGuard commented Feb 17, 2011

Matthew, is this zsh friendly as well?

@matthewmccullough
Copy link
Author

matthewmccullough commented Feb 21, 2011

I have a better total-config setup for you that includes my latest ZSH derivations. It is at https://github.com/matthewmccullough/MatthewsShellConfig

@btv
Copy link

btv commented Apr 20, 2011

Hey, thank you for posting that. I found a different one the internet a long time ago. Posting a comment here because it's related.
https://gist.github.com/932742

@matthewmccullough
Copy link
Author

matthewmccullough commented Apr 20, 2011

Glad to have provided it and also a nod to @halbtuerke who started the bulk of this code.

@HowlingMind
Copy link

HowlingMind commented May 27, 2011

This is great. Exactly what I was looking for. Really the only thing I changed (other than the prompt itself) was to clear the state variable every run. It was always saying my repo was dirty once it had been dirty. I actually just put an else and made a blue "C" for clean working state.

Update: Added number of commits ahead/behind.

@matthewmccullough
Copy link
Author

matthewmccullough commented May 27, 2011

@matthewmccullough
Copy link
Author

matthewmccullough commented Dec 3, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment