Search code examples
gitbashubuntu

Adding git branch on the Bash command prompt


I tried adding the git branch I'm currently working on (checked-out) on the bash prompt without success.. (while keeping my current path which shows the active directory/file intact) I have a .bashrc file on my home, but I also saw many people mentioning the .profile file..


Solution

  • git 1.9.3 or later: use __git_ps1

    Git provides a shell script called git-prompt.sh, which includes a function __git_ps1 that

    prints text to add to bash PS1 prompt (includes branch name)

    Its most basic usage is:

    $ __git_ps1
    (master)
    

    It also takes an optional format string:

    $ __git_ps1 'git:[%s]'
    git:[master]
    

    How to Get It

    First, copy the file to somewhere (e.g. ~/.git-prompt.sh).

    Option 1: use an existing copy on your filesystem. Example (Mac OS X 10.15):

    $ find / -name 'git-prompt.sh' -type f -print -quit 2>/dev/null
    /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
    

    Option 2: Pull the script from GitHub.

    Next, add the following line to your .bashrc/.zshrc:

    source ~/.git-prompt.sh
    

    Finally, change your PS1 to call __git_ps1 as command-substitution:

    Bash:

    PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
    

    Zsh:

    setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
    

    Maksym Kosenko adds in the comments:

    An interesting point: if you have a call of __git_ps1 function in your .bashrc file and there is a function named test somewhere in the same file, the last one will be executed automatically together with any git action.
    It seems like inside of __git_ps1 there is a call of some test function which is obviously overridden by your custom one.


    git < 1.9.3

    But note that only git 1.9.3 (May 2014) or later allows you to safely display that branch name(!)

    See commit 8976500 by Richard Hansen (richardhansen):

    Both bash and zsh subject the value of PS1 to parameter expansion, command substitution, and arithmetic expansion.

    Rather than include the raw, unescaped branch name in PS1 when running in two- or three-argument mode, construct PS1 to reference a variable that holds the branch name.

    Because the shells do not recursively expand, this avoids arbitrary code execution by specially-crafted branch names such as

    '$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)'.
    

    What devious mind would name a branch like that? ;) (Beside a Mom as in xkcd)

    More Examples

    still_dreaming_1 reports in the comments:

    This seems to work great if you want a color prompt with xterm (in my .bashrc):

    PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\03‌​3[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ ' 
    

    Everything is a different color, including the branch.

    In Linux Mint 17.3 Cinnamon 64-bit:

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ ' 
    

    As noted by J'e in the comments

    Ubuntu

    Modify PS1 assignments in your bashrc with,

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\033[0;32m$(__git_ps1 " (%s)")\033[0m\$ '
    
    # ---AND--- 
    
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__git_ps1 " (%s)")\$ '