Adding git branch on the Bash command prompt
GitBashUbuntuGit Problem Overview
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..
Git Solutions
Solution 1 - Git
__git_ps1
git 1.9.3 or later: use 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)")]\$ '
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\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ '
> Everything is a different color, including the branch.
In 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) \$ '
Solution 2 - Git
Follow the steps as below: (Linux)
Edit the file ~/.bashrc
, to enter following lines at its end (In case, of Mac, file would be ~/.bash_profile
)
# Git branch in prompt.
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
Now, start the new terminal window, and try entering to any git-repo. The current branch would be shown, with the prompt.
Solution 3 - Git
1- If you don't have bash-completion ... : sudo apt-get install bash-completion
2- Edit your .bashrc file and check (or add) :
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
3- ... before your prompt line : export PS1='$(__git_ps1) \w\$ '
(__git_ps1 will show your git branch)
4- do source .bashrc
EDIT :
Further readings : Don’t Reinvent the Wheel
Solution 4 - Git
Here is how I configured the prompt to display Git status:
Get git-prompt script:
curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
And customize your prompt adding the following code in your .bashrc file:
# Load Git functions
source ~/.git-prompt.sh
# Syntactic sugar for ANSI escape sequences
txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m' # Black - Background
bakred='\e[41m' # Red
badgrn='\e[42m' # Green
bakylw='\e[43m' # Yellow
bakblu='\e[44m' # Blue
bakpur='\e[45m' # Purple
bakcyn='\e[46m' # Cyan
bakwht='\e[47m' # White
txtrst='\e[0m' # Text Reset
# Prompt variables
PROMPT_BEFORE="$txtcyn\u@\h $txtwht\w$txtrst"
PROMPT_AFTER="\\n\\\$ "
# Prompt command
PROMPT_COMMAND='__git_ps1 "$PROMPT_BEFORE" "$PROMPT_AFTER"'
# Git prompt features (read ~/.git-prompt.sh for reference)
export GIT_PS1_SHOWDIRTYSTATE="true"
export GIT_PS1_SHOWSTASHSTATE="true"
export GIT_PS1_SHOWUNTRACKEDFILES="true"
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS="true"
If you want to find out more, you can get all the dotfiles here: https://github.com/jamming/dotfiles
Solution 5 - Git
For mac, this works really well: http://martinfitzpatrick.name/article/add-git-branch-name-to-terminal-prompt-mac/:
# Git branch in prompt.
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
Solution 6 - Git
At first, open your Bash Profile in your home directory. The easiest way to open & edit your bash_profile using your default editor.
For example, I open it using the VS Code using this command: code .bash_profile.
Then just paste the following codes to your Bash.
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
The function
> parse_git_branch()
will fetch the branch name & then through PS1 you can show it in your terminal.
Here,
> \u = Username > > @ = Static Text > > \h = Computer Name > > \w = Current Directory > > $ = Static Text
You can change or remove these variables for more customization.
If you use Git for the first time in terminal or instantly after configuration, maybe sometimes you can not see the branch name.
If you get this problem, don't worry. In that case, just make a sample repository and commit it after some changes. When the commit command will execute once, the terminal will find git branch from then.
Solution 7 - Git
root:~/project# -> root:~/project(dev)#
add the following code to the end of your ~/.bashrc
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
Solution 8 - Git
vim ~/.bash
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\] $"
To reflect latest changes run following command
source ~/.bashrc
Output:-
chandrakant@NDL41104 ~/Chandrakant/CodeBase/LaravelApp (development) $
Solution 9 - Git
I wanted a clean solution that appended to the existing prompt instead of replacing it. As with other solutions, add this to the bottom of your .bashrc
# function
parse_git_branch() {
if [ -n "$(git rev-parse --git-dir 2> /dev/null)" ]; then
echo "($(git rev-parse --abbrev-ref HEAD)) "
fi
}
# environment customization
export PS1="$PS1\$(parse_git_branch)"
A typical setup would yield a prompt that looks like
user@machine:/path/to/git/project$ (branch-name)
Solution 10 - Git
If you use the fish shell its quite straight forward.
fish is an interactive shell which comes with lots of goodies. You can install it using apt-get
.
sudo apt-get install fish
you can then change the prompt setting using
> fish_config
Web config started at 'http://localhost:8001/'. Hit enter to stop.
Created new window in existing browser session.
now go to http://localhost:8001/
open the prompt tab and choose the classic + git option
Now click on the use prompt button and you are set.
Solution 11 - Git
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]$(parse_git_branch)\n\$ '
Solution 12 - Git
Follow the below steps to show the name of the branch of your GIT repo in ubuntu terminal:
step1: open terminal and edit .bashrc using the following command.
vi .bashrc
step2: add the following line at the end of the .bashrc file :
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' }
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
step3: source .bashrc in the root (home) directory by doing:
/rootfolder:~$ source .bashrc
Step4: Restart and open the terminal and check the cmd. Navigate to your GIt repo directory path and you are done. :)
Solution 13 - Git
Here is a simple clean version that I use: link
Solution 14 - Git
I have tried a small script in python that goes in a bin folder.... 'gitprompt' file
#!/usr/bin/env python
import subprocess, os
s = os.path.join(os.getcwd(), '.git')
def cut(cmd):
ret=''
half=0
record = False
for c in cmd:
if c == "\n":
if not (record):
pass
else:
break
if (record) and c!="\n":
ret = ret + c
if c=='*':
half=0.5
if c==' ':
if half == 0.5:
half = 1
if half == 1:
record = True
return ret
if (os.path.isdir(s)):
out = subprocess.check_output("git branch",shell=True)
print cut(out)
else:
print "-"
Make it executable and stuff
Then adjust the bash prompt accordingly like :
\u:\w--[$(gitprompt)] \$