At my last gig I got a crash course in using git fulltime, and I really enjoyed getting used to it, and leaving things like subversion and CVS behind forever. And yes, while I’m sure I gave Ant a few gray hairs on the way, we eventually got there together. He gave me a customized .gitrc to use, which I’ve modified a bit, and now have shared as a gist. This .gitrc tells you the branch you’re on, with color handling of the bash prompt according to the branch/status of the current git repo. For example, the prompt would look like this: ~/foo $ with master colored RED, until you’ve added a file to the repo, but not committed it, when it will turn YELLOW. Once pushed it will turn back to RED to tell you things are in sync. As a bonus, after every command this will set the color of dollar prompt based on return value of previous command. If it’s 0 it will be white to indicate success, if it’s !0 it will be red, indicating an error.
#!/bin/bash
#
# Set your bash prompt according to the branch/status of the current git repository.
#
# One-line install:
# curl https://gist.github.com/philcryer/5066010/raw/784e1e4c9df5289fe6f922fb6d122461d374758c/gitrc -o ~/.gitrc; echo "source ~/.gitrc" >> ~/.profile; source ~/.profile
#
# Originally forked from http://gist.github.com/31934 then modified liberally.
#
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 is_git_repository {
git branch > /dev/null 2>&1
}
function parse_git_branch {
# Only display git info if we're inside a git repository.
is_git_repository || return 1
# Capture the output of the "git status" command.
git_status="$(git status 2> /dev/null)"
# Set color based on clean/staged/dirty.
if [[ ${git_status} =~ "working directory clean" ]]; then
state="${GREEN}"
elif [[ ${git_status} =~ "Changes to be committed" ]]; then
state="${YELLOW}"
else
state="${RED}"
fi
# Set arrow icon based on status against remote.
remote_pattern="# Your branch is (.*) of"
if [[ ${git_status} =~ ${remote_pattern} ]]; then
if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then
remote="↑"
else
remote="↓"
fi
fi
diverge_pattern="# Your branch and (.*) have diverged"
if [[ ${git_status} =~ ${diverge_pattern} ]]; then
remote="↕"
fi
# Get the name of the branch.
branch_pattern="^# On branch ([^${IFS}]*)"
if [[ ${git_status} =~ ${branch_pattern} ]]; then
branch=${BASH_REMATCH[1]}
fi
# Display the prompt.
echo "${state}(${branch})${remote}${COLOR_NONE} "
}
function prompt_symbol () {
# Set color of dollar prompt based on return value of previous command.
if test $1 -eq 0
then
echo "\$"
else
echo "${RED}\$${COLOR_NONE}"
fi
}
function prompt_func () {
last_return_value=$?
PS1="[\w]$(parse_git_branch)$(prompt_symbol $last_return_value) "
#temp
#PS1="[\w$(parse_git_branch)]$ "
}
PROMPT_COMMAND=prompt_func
Install it by downloading the file, then in a console:
mv gitrc ~/.gitrc
Hope this helps in your git adventures. Of course there are more tricks, shortcuts and cool things you can do in .gitrc, have you done anything that would expand on this? If so, share below! Thanks.