Git Status in Your Prompt

Did you know: You can have a visual representation of the git status command output in your shell prompt? This is especially convenient for people who use the git command-line interface (CLI). Unfortunately, this doesn't work with the Windows command prompt or cmd. But there are a few workarounds.

git-prompt.sh

Disclaimer: For this part of the article, I will show the how-tos by using Debian (on Windows Subsystem for Linux or WSL) and FreeBSD as examples. These are the Unix-like systems that I have access to currently. For other systems or Linux distros, the steps should be the same except for the location or name of the git-prompt.sh file.

When git is installed in a Unix-like system, it usually comes with the script file git-prompt.sh. The location and file name of this file may differ depending on the type of system or distro you use.

Locating the Script File

In FreeBSD, this shell script is located in /usr/local/share/git-core/contrib/completion/.

It is a bit different for Debian and/or Debian-based distros. The script file you should look for is git-sh-prompt. I believe it is similar to git-prompt.sh only with a different name. This file can be found in /usr/lib/git-core/.

Setting It Up

It is documented very clearly in the script file on how to use it and the instruction is for both bash and zsh shells. The instruction also states the different flags you can toggle depending on the information you want displayed in the shell prompt.

Firstly, copy this script file to your home directory and rename it to .git-prompt.sh.

# FreeBSD
$ cp /usr/local/share/git-core/contrib/completion/git-prompt.sh ~/.git-prompt.sh

# Debian
$ cp /usr/lib/git-core/git-sh-prompt ~/.git-prompt.sh

Next, you'll need to configure your shell, bash or zsh, to source the ~/.git-prompt.sh file. To do that, add the code snippet below to either the ~/.bashrc or ~/.zshrc file.

source ~/.git-prompt.sh

This step is different for FreeBSD users because it doesn't have neither a ~/.bashrc nor a global bashrc file. Instead, you can do the same with the ~/.profile file.

The next fun thing to do is to configure the information you want to show in your shell prompt. The flags available are:

  • GIT_PS1_SHOWDIRTYSTATE
  • GIT_PS1_SHOWSTASHSTATE
  • GIT_PS1_SHOWUNTRACKEDFILES
  • GIT_PS1_SHOWUPSTREAM
  • GIT_PS1_STATESEPARATOR
  • GIT_PS1_DESCRIBE_STYLE
  • GIT_PS1_HIDE_IF_PWD_IGNORED
  • GIT_PS1_SHOWCOLORHINTS

I will not go into detail what each flag means or the different values to enable them because it is clearly documented in the git-prompt.sh script file. Have a read and play with the flags to see what suits you.

As a reference, you can refer to the code snippet below on the flags I have configured for my setup.

export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1
export GIT_PS1_HIDE_IF_PWD_IGNORED=1
export GIT_PS1_SHOWUNTRACKEDFILES=1

Finally, with all of that done, we have to update $PS1 to show the necessary information from git status based on the flags we have enabled in the step above.

There are two ways to do this. Below is an example to do it either ways. Add either one of the code below to your ~/.bashrc, ~/.zshrc or /.profile file.

# Method 1
export PS1='\u@\h \w$(__git_ps1 " (%s)") \$'

# Method 2
export PROMPT_COMMAND='__git_ps1 "=\u@\h:\w" "\\\$ "'

Save your changes and run source ~/.bashrc (or /.zshrc or /.profile). Go to one of your local git repositories and you'll see something like below.

# Examples of 'git status' output in the shell prompt
# ===================================================
#
# Current branch is on 'master' and is sync with upstream or 'origin/master'
alvinsim@beastie:~$ ~/src/dotfiles (master=) $

# Current branch is on 'master' and one or more new/untracked files has been added
alvinsim@beastie:~$ ~/src/dotfiles (master %=) $

# Current branch is on 'master' and one or more files are modified
alvinsim@beastie:~$ ~/src/dotfiles (master *=) $

# Current branch is on 'master' and one or more files are staged for commit
alvinsim@beastie:~$ ~/src/dotfiles (master +=) $

# Current branch 'master' is one or more commits ahead of 'origin/master' or upstream
alvinsim@beastie:~$ ~/src/dotfiles (master>) $

# Current branch 'master' is one or more commits behind of 'origin/master' or upstream
alvinsim@beastie:~$ ~/src/dotfiles (master<) $

You can refer to the full code snippet below. You should have something similar.

# change value of PS1 to show git status of a git repo
source ~/.git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1
export GIT_PS1_HIDE_IF_PWD_IGNORED=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
#export PS1='\u@\h \w$(__git_ps1 " (%s)") \$ '
export PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'

Without git-prompt.sh

If you are not able to locate the git-prompt.sh script file, or it didn't come as part of the git installation, you can download it from git's Github repository.

On Windows?

As far as I know, there are two ways to achieve this ― Git Bash and PowerShell.

Git Bash

img

Download the git setup file for Windows from https://git-scm.com or https://gitforwindows.org and run it. Personally, I prefer to use Chocolatey, a package manager for Windows, to install git by running the command choco install git -y.

git for Windows comes with something extra called Git BASH. It is a BASH emulator where you can run the git command just like you would on a Unix-like system. You'll also have all the common Unix commands at your disposal. Yeah, it is something similar to Cygwin.

In Git BASH, the git-prompt.sh file is located in /mingw64/share/git/completion/.

PowerShell

For those who do not prefer to use BASH, another option is to use Windows PowerShell. There is a PowerShell module called posh-git. You can follow the installation instructions as stated in the README.md file. I am sorry that I can't provide a step-by-step guide here because I am not familiar with PowerShell and the instructions didn't work for me.

__git_ps1: command not found

If for some unknown reason you see the message __git_ps1: command not found, this basically means that the shell is not a login shell. You can refer to this answer at Unix & Linux Stack Exchange for more clarity.

I encountered this once in my FreeBSD system when using tmux. The bash shell was not started as a login shell. Thus, the shell ignored the ~/.profile file.

Wrapping Up

I hope that you find this article useful especially if you use git in the terminal a lot in a Unix-like system or some kind of emulator. If you have a simple guide on how to set this up for PowerShell and don't mind sharing, I will link it here.

Share this: