What I have tried
I have updated my prompt to include the branch name using __git_ps1
. In addition, I set GIT_PS1_SHOWCOLORHINTS
.
The problem
The prompt appears correctly. However, the branch color is always green. I expected a dirty branch to be red.
The docs state:
The colors are based on the colored output of "git status -sb"
I found and reviewed How to colorize git-status output? But I'm not sure what options I'd need to change...
The question
Is it possible to change the branch color to be green for a clean branch and red for a dirty branch? If so, how?
The colours shown by
__git_ps1
for dirty branches don't affect the branch name; they affect the "dirty state indicator". In addition to enabling colours, if you enable this indicator you will see a red asterisk for a dirty branch:There is no way to change the colour of the branch name based on dirty status without modifying the
git-prompt.sh
code, or providing your own function.Note that this works with
export PROMPT_COMMAND
but notexport PS1
.I was able to achieve a decent solution by:
1. Cloning the latest git source, to obtain and install a recent
git-prompt.sh
(Your distro may already have an up-to-date script)2. Removing the check that is stopping the script from inserting color codes in the output string.
3. Altering my .bashrc to include a call to
__git_ps1
with some formatting options to alter my terminal prompt text.Commit and documentation, including specific files and edits I made: https://github.com/karlapsite/git/commit/b34d9e8b690ec0b304eb794011938ab49be30204#diff-a43cc261eac6fbcc3578c94c2aa24713R449
Now, my console has all of the information I wanted: I can open a terminal, and cd into any git repo:
$ cd ~/Github/git user@hostname:~/Github/git:(master)$ # 'master' is green
And the when I checkout a hash, and move into a detached head state:
$ git checkout bca18110 user@hostname:~/Github/git:(bca1811...)$ # the commit hash is red
I needed to follow this answer: https://stackoverflow.com/a/13997892/4717806 to have bash properly re-interpret the color codes after each command, but my terminal is intact, linewrapping still works, and my prompt is colored the way I wanted!