248

I am using this guide to show the branch name in gnome terminal (Ubuntu 15.10) when working in a git repository. Based on the above I now have the below in my ~/.bashrc file:

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes 

...

# Add git branch if its present to PS1
parse_git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt

As a result I now get:

enter image description here

so it works. But why has the coloring of my user@host been removed? And I would also expect that the branch name should be colored. Before it looked like this:

enter image description here

UPDATE: I have now tried this guide instead:

https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt

adding this to .bashrc:

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

and that works:

enter image description here

Notice in .bashrc I also have this (default):

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

I have yet to find the reason why that snippet gives the correct result and the other version does not. Any input on this?

Here is the version of my .bashrc that has the old snippet enabled that does not work:

http://pastebin.com/M8kjEiH3

17
  • Was force_color_prompt uncommented before?
    – muru
    Feb 7, 2016 at 8:13
  • Yes I have tried with both uncommented and commented same result. The guide posted above says its should be commented out.
    – u123
    Feb 7, 2016 at 8:18
  • Can you post your complete .bashrc? IIRC the default .bashrc doesn't enable colour prompts, so you have to change it to show colours. It depends on what you changed.
    – muru
    Feb 7, 2016 at 8:20
  • 1
    Have a look at line 64, which should tell you why uncommenting force_color_prompt didn't help.
    – muru
    Feb 7, 2016 at 8:39
  • 2
    @u123 don't worry about the default .bashrc too much. If you mess up, you can always get the original from /etc/skel/.bashrc.
    – muru
    Feb 7, 2016 at 8:52

15 Answers 15

228

This snippet:

# Add git branch if its present to PS1

parse_git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi

Is meant to replace the default prompt definition:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

Which ends with:

unset color_prompt force_color_prompt

The .bashrc you posted shows you're adding it after the default prompt definition and unset color_prompt force_color_prompt (line #64).

Either replace the default prompt definition with the snippet or leave your ~/.bashrc as it is and comment the default prompt definition along with unset color_prompt force_color_prompt on line #64:


So part of your .bashrc could look like

parse_git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\] $(parse_git_branch)\[\033[00m\]\$ '
else
 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
# THE SIX LINES BELOW are the default prompt and the unset (which were in the original .bashrc)
#if [ "$color_prompt" = yes ]; then
#    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
#else
#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
#fi
#unset color_prompt force_color_prompt

screensot

10
  • Verified the above and you are correct. I will stick with new version of snippet since it works without having to modify the default parts of the bashrc file.
    – u123
    Feb 7, 2016 at 8:51
  • 1
    it fails to add color to the branch name. Feb 7, 2016 at 10:11
  • @AvinashRaj Test it with a copy of the default ~/.bashrc in /etc/skel/.bashrc, you might have something interfering in your ~/.bashrc.
    – kos
    Feb 7, 2016 at 10:15
  • un-comment force_color_prompt=yes (line # 48) if the colors are not visible. Jun 7, 2017 at 6:05
  • 3
    To color your branch according to its status, you can use the native git-prompt script provided by git itself. Jan 15, 2018 at 11:42
207

Ubuntu: Show your branch name on your terminal

Add these lines in your ~/.bashrc file

# Show git branch name
force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt

Reload the .bashrc file with this command:

$ source ~/.bashrc
22
  • 13
    This worked for me on 18.04!
    – cbloss793
    Jan 7, 2019 at 20:18
  • 2
    Thanks. Using: Ubuntu 18.04.1 LTS Jan 10, 2019 at 6:38
  • 1
    It worked also for me on elementaryOS 0.4 Loki. As simple as open my ~/.bashrc with the command sudo nano ~/.bashrc, copy your code at the end of the file, save it, exit and reload the ~/.bashrc with the code you pasted above. Thanks a lot ;)
    – call0fcode
    Jan 23, 2019 at 22:53
  • 3
    This worked and kept the colors! (Ubuntu 18.04) Feb 26, 2019 at 23:39
  • 7
    On Ubuntu 20.10 working correctly ;)
    – michal
    Oct 24, 2020 at 12:07
23

For now, I followed this https://gist.github.com/eliotsykes/47516b877f5a4f7cd52f and working, liking it so far, though I'm planning to customize it further.

In Terminal

mkdir ~/.bash

Copy the raw git-prompt.sh file from git contrib in to the ~/.bash directory: https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh

Inside ~/.bashrc or ~/.bash_profile (choose the file where you normally put any bash customizations/setup), add the lines:

source ~/.bash/git-prompt.sh # Show git branch name at command prompt
export GIT_PS1_SHOWCOLORHINTS=true # Option for git-prompt.sh to show branch name in color

# Terminal Prompt:
# Include git branch, use PROMPT_COMMAND (not PS1) to get color output (see git-prompt.sh for more)
export PROMPT_COMMAND='__git_ps1 "\w" "\n\\\$ "' # Git branch (relies on git-prompt.sh)

As long as you're inside a git repo, your Bash prompt should now show the current git branch in color signifying if its got uncommitted changes.

2
  • 3
    This should be the accepted answer, as it's clear, concise, and does the job, and it works on other platforms too. May 15, 2019 at 10:48
  • The following at the end of ~/.bashrc simply appends to the distribution's default color prompt export PROMPT_COMMAND='__git_ps1 "'${PS1%???}'" "\n\\\$ "' Nov 24, 2020 at 15:41
12

Quick hack:

  1. Adding this to ~/.bashrc:
parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

export PS1="\u@\h \[\e[32m\]\w \[\e[91m\]\$(parse_git_branch)\[\e[00m\]$ "
  1. Restart the terminal, or source ~/.bashrc:

enter image description here

More detail: https://medium.com/@thucnc/how-to-show-current-git-branch-with-colors-in-bash-prompt-380d05a24745

2
  • I had this in my centOS & RHEL VMs and worked there, but for Ubuntu this didn't update on switching the current directory. Had to follow this for setting and unsetting values Mar 30, 2021 at 9:45
  • This works but changes the default prompt colors.
    – thanos.a
    Oct 20, 2022 at 19:13
7

Append the lines below to ~/.bashrc:

export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true

export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
3
  • works on ubuntu 18.04
    – fanny
    Nov 8, 2019 at 16:06
  • Awesome, working!!!! Mar 1, 2022 at 12:09
  • Other answers were great, but this was the simplest, fastest, and least cumbersome change to make on Ubuntu 22.
    – BigBlueHat
    Oct 26, 2023 at 13:07
3

Go to home folder

click Ctrl+h to show hidden files.

Open .bashrc file and at the end paste the next:

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

In case you have your terminal opened, close and open again. Enjoy!!

1
  • Hello, I tried it and it works only where I switch superuser, can you tell me how to enable always? Nov 24, 2018 at 16:37
3

I use bash-git-prompt. It's configurable and easier than writing your own, which I imagine is what many readers are looking for.

0
2

Why bother with using sed? as in ...

git branch 2> /dev/null | sed -e '/^[^]/d' -e 's/ (.*)/(\1)/'

Much easier to just use:

git branch --show-current

It outputs the current branch and no extra characters!

2
  • Indeed, git branch --show-current 2> /dev/null | sed -e 's/\(.*\)/ (\1)/' works for me.
    – igor
    Jul 10, 2021 at 9:48
  • 3
    Please always try to provide the full answer even if you you are trying to improve someone else's answer. :)
    – Rajan
    Dec 11, 2021 at 18:19
2

My variant for KUbuntu 20.04 LTS, derived from the original value of the PS1:

# put into ~/.bashrc
parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
2

Topic is old but I will post being able to help someone. In the .bashrc file located inside the user's local folder, replace the existing PS1 with this one:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[1;36m\]$(__git_ps1 " (%s)")\[\033[01;34m\]$\[\033[00m\]'

If you want to change the color of the branch change the color before the parameter $ (__ git_ps1 "(% s)") that is, change this value:

 \[\033[1;36m\]

color chart https://gist.github.com/avelino/3188137

1

My problem was that I hadn't enabled the option

Run command as a login shell in

TerminalEditProfile PreferencesCommand

1
  • I think it's visually apparent from the question that this probably isn't the case here, but it may apply to others.
    – Oli
    Dec 11, 2021 at 22:28
0

replace

parse_git_branch

with

parse_git_branch 2>/dev/null

in your PS1 definition and live happily ever after.

0
sudo vi .bashrc

Write below code the button of the file:

git_branch() {
 git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
export PS1="\[\033[1;36m\]\u\[\033[1;31m\]@\[\033[1;32m\]\h:\[\033[1;35m\]\w\[\033[1;31m\]\$\[\033[0m\]\$(git_branch)\$ "
source .bashrc
1
  • 2
    You should not need to use sudo to modify your own login file May 5, 2021 at 19:42
0

Best and short solution. Modify .bashrc file located in ~/ directory. Change PS1 variable. In my case it is 60 line. Excerpts of .bashrc file with modified PS1 variable:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;36m\]`__git_ps1`\[\033[00m\]\n\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

I've add __git_ps1 variable and \n for new line for better readability. Worked in Ubuntu 22.04 LTS and 20.04.4 LTS with git installed. Example: sample of the terminal

-1

In my case I didn't overwrite the PS1 variable because I had to preserve the prepended environment that is added by anaconda package, that is the (base) in the image bellow. I use Ubuntu 20.04, and all I wanted is to append the branch at the end, thanks to @thucnguyen as my solution is based on his one:

terminal screenshot

parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
export PS1="$PS1\[\e[91m\]\$(parse_git_branch)\[\e[00m\]"

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .