How can I display the current branch and folder path in terminal?

I've been watching some of the Team Treehouse videos and they have a very nice looking terminal when working with Git.

For example they have (something similar):

mike@treehouseMac: [/Work/test - feature-branch-name] $ git add . mike@treehouseMac: [/Work/test - feature-branch-name] $ git commit -m "Some feature." mike@treehouseMac: [/Work/test - feature-branch-name] $ git checkout master mike@treehouseMac: [/Work/test - master] $ git status 

How can my terminal show me some useful information of what branch I'm on, with colors to distinguish bits of the data I want? Is there some sort of de-facto plugin I haven't found yet?

I'm using Mac OSX 10.8

15 Answers

For anyone looking for how to do this in macOS Catalina or above (10.15+ incl. Big Sur 11.0) which has deprecated bash in favour of zsh, here is my .zshrc file:

parse_git_branch() { git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p' } COLOR_DEF='%f' COLOR_USR='%F{243}' COLOR_DIR='%F{197}' COLOR_GIT='%F{39}' NEWLINE=$'\n' setopt PROMPT_SUBST export PROMPT='${COLOR_USR}%n@%M ${COLOR_DIR}%d ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}${NEWLINE}%% ' 

If you don't like the colours I have used, replace the 243/197/39 values with the colour codes as defined here:

14

Simple way

Open ~/.bash_profile in your favorite editor and add the following content to the bottom.

Git branch in prompt.

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

Add Git Branch To Terminal Prompt (Mac)

3

It's not about a plugin. It's about prompt tricks in the shell.

For a cool setup in bash, check out the dotfiles project of this guy:

To get a fancy prompt, include the .bash_prompt in your ~/.bash_profile or ~/.bashrc.

To get the exact same prompt as in your question, change the export PS1 line at the end of .bash_prompt like this:

export PS1="\[${BOLD}${MAGENTA}\]\u\[$WHITE\]@\[$ORANGE\]\h\[$WHITE\]: [\[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" - \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]] \$ \[$RESET\]" 

I ended up using all the .bash* files from this repository about a month ago, and it's been really useful for me.

For Git, there are extra goodies in .gitconfig.

And since you're a mac user, there are even more goodies in .osx.

4

To expand on the existing great answers, a very simple way to get a great looking terminal is to use the open source Dotfiles project.


enter image description here


Installation is dead simple on OSX and Linux. Run the following command in Terminal.

git clone && cd dotfiles && source bootstrap.sh 

This is going to:

  1. Git clone the repo.
  2. cd into the folder.
  3. Run the installation bash script.
12

My prompt includes:

  • Exit status of last command (if not 0)
  • Distinctive changes when root
  • rsync-style user@host:pathname for copy-paste goodness
  • Git branch, index, modified, untracked and upstream information
  • Pretty colours

Example: Screenshot of my prompt in action To do this, add the following to your ~/.bashrc:

# # Set the prompt # # # Select git info displayed, see /usr/share/git/completion/git-prompt.sh for more export GIT_PS1_SHOWDIRTYSTATE=1 # '*'=unstaged, '+'=staged export GIT_PS1_SHOWSTASHSTATE=1 # '$'=stashed export GIT_PS1_SHOWUNTRACKEDFILES=1 # '%'=untracked export GIT_PS1_SHOWUPSTREAM="verbose" # 'u='=no difference, 'u+1'=ahead by 1 commit export GIT_PS1_STATESEPARATOR='' # No space between branch and index status export GIT_PS1_DESCRIBE_STYLE="describe" # detached HEAD style: # contains relative to newer annotated tag (v1.6.3.2~35) # branch relative to newer tag or branch (master~4) # describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f) # default exactly eatching tag # Check if we support colours __colour_enabled() { local -i colors=$(tput colors 2>/dev/null) [[ $? -eq 0 ]] && [[ $colors -gt 2 ]] } unset __colourise_prompt && __colour_enabled && __colourise_prompt=1 __set_bash_prompt() { local exit="$?" # Save the exit status of the last command # PS1 is made from $PreGitPS1 + <git-status> + $PostGitPS1 local PreGitPS1="${debian_chroot:+($debian_chroot)}" local PostGitPS1="" if [[ $__colourise_prompt ]]; then export GIT_PS1_SHOWCOLORHINTS=1 # Wrap the colour codes between \[ and \], so that # bash counts the correct number of characters for line wrapping: local Red='\[\e[0;31m\]'; local BRed='\[\e[1;31m\]' local Gre='\[\e[0;32m\]'; local BGre='\[\e[1;32m\]' local Yel='\[\e[0;33m\]'; local BYel='\[\e[1;33m\]' local Blu='\[\e[0;34m\]'; local BBlu='\[\e[1;34m\]' local Mag='\[\e[0;35m\]'; local BMag='\[\e[1;35m\]' local Cya='\[\e[0;36m\]'; local BCya='\[\e[1;36m\]' local Whi='\[\e[0;37m\]'; local BWhi='\[\e[1;37m\]' local None='\[\e[0m\]' # Return to default colour # No username and bright colour if root if [[ ${EUID} == 0 ]]; then PreGitPS1+="$BRed\h " else PreGitPS1+="$Red\u@\h$None:" fi PreGitPS1+="$Blu\w$None" else # No colour # Sets prompt like: ravi@boxy:~/prj/sample_app unset GIT_PS1_SHOWCOLORHINTS PreGitPS1="${debian_chroot:+($debian_chroot)}\u@\h:\w" fi # Now build the part after git's status # Highlight non-standard exit codes if [[ $exit != 0 ]]; then PostGitPS1="$Red[$exit]" fi # Change colour of prompt if root if [[ ${EUID} == 0 ]]; then PostGitPS1+="$BRed"'\$ '"$None" else PostGitPS1+="$Mag"'\$ '"$None" fi # Set PS1 from $PreGitPS1 + <git-status> + $PostGitPS1 __git_ps1 "$PreGitPS1" "$PostGitPS1" '(%s)' # echo '$PS1='"$PS1" # debug # defaut Linux Mint 17.2 user prompt: # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\] $(__git_ps1 "(%s)") \$ ' } # This tells bash to reinterpret PS1 after every command, which we # need because __git_ps1 will return different text and colors PROMPT_COMMAND=__set_bash_prompt 
2

In 2019, I think git branch --show-current is a better command than the accepted answer.

$ git branch --show-current master 

(Added in git 2.22 release in June 2019)

It runs much faster as it doesn't need to iterate through all branches. Similarly git branch should be avoided too in the command prompt as it slows down your prompt if you have many local branches.

Put it in a function to use anywhere on command prompt:

 # This function returns '' in all below cases: # - git not installed or command not found # - not in a git repo # - in a git repo but not on a branch (HEAD detached) get_git_current_branch() { git branch --show-current 2> /dev/null } 

More context:

$ git version git version 2.23.0 
2

For Mac Catilina 10.15.5 and later version:

add in your ~/.zshrc file

function parse_git_branch() { git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p' } setopt PROMPT_SUBST export PROMPT='%F{grey}%n%f %F{cyan}%~%f %F{green}$(parse_git_branch)%f %F{normal}$%f ' 
3

Just Install the oh-my-zsh plugins as described in this link.

enter image description here

It works best on macOS and Linux.

Basic Installation

Oh My Zsh is installed by running one of the following commands in your terminal. You can install this via the command-line with either curl or wget.

via curl

sh -c "$(curl -fsSL )" 

via wget

sh -c "$(wget -O -)" 

for anyone still looking for this , i just installed ohmyz and the branches it's showing enter image description here

1

The git package installed on your system includes bash files to aid you in creating an informative prompt. To create colors, you will need to insert terminal escape sequences into your prompt. And, the final ingredient is to update your prompt after each command gets executed by using the built-in variable PROMPT_COMMAND.

Edit your ~/.bashrc to include the following, and you should get the prompt in your question, modulo some color differences.

# # Git provides a bash file to create an informative prompt. This is its standard # location on Linux. On Mac, you should be able to find it under your Git # installation. If you are unable to find the file, I have a copy of it on my GitHub. # # # source /usr/share/git/completion/git-prompt.sh # # Next, we need to define some terminal escape sequences for colors. For a fuller # list of colors, and an example how to use them, see my bash color file on my GitHub # and my coniguration for colored man pages. # # # # color_start='\e[' color_end='m' color_reset='\e[0m' color_bg_blue='44' # # To get a fancy git prompt, it's not sufficient to set PS1. Instead, we set PROMPT_COMMAND, # a built in Bash variable that gets evaluated before each render of the prompt. # export PROMPT_COMMAND="PS1=\"\${color_start}\${color_bg_blue}\${color_end}\u@\h [\w\$(__git_ps1 \" - %s\")]\${color_reset}\n\$ \"" # # If you find that the working directory that appears in the prompt is ofter too long, # then trim it. # export PROMPT_DIRTRIM=3 

In the new Catalina OS for Mac

i) zsh way. Add below lines in .zshrc

parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/' } COLOR_DEF='%f' COLOR_DIR='%F{197}' COLOR_GIT='%F{33}' setopt PROMPT_SUBST export PROMPT='${COLOR_DIR}%1d${COLOR_DEF}${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ ' 

ii) Or to use old bash, you need to change

 System Preference -> Users & Groups -> Right click user user -> Advanced Option -> Login shell -> /bin/bash 

Write .bash_profile as below and restart the system

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

Output: FolderName BranchName $

There are many PS1 generators but ezprompt has the git status (2nd tab 'Status Elements' ) also.

Based on 6LYTH3's answer I've decided to post my own due to some improvements that may come in handy:

Simple solution

Open ~/.bash_profile and add the following content

# \[\e[0m\] resets the color to default color reset_color='\[\e[0m\]' # \[\033[33m\] sets the color to yellow path_color='\[\033[33m\]' # \e[0;32m\ sets the color to green git_clean_color='\[\e[0;32m\]' # \e[0;31m\ sets the color to red git_dirty_color='\[\e[0;31m\]' # determines if the git branch you are on is clean or dirty git_prompt () { # Is this a git directory? if ! git rev-parse --git-dir > /dev/null 2>&1; then return 0 fi # Grab working branch name git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p') # Clean or dirty branch if git diff --quiet 2>/dev/null >&2; then git_color="${git_clean_color}" else git_color="${git_dirty_color}" fi echo " [$git_color$git_branch${reset_color}]" } export PS1="${path_color}\w\[\e[0m\]$(git_prompt)\n" 

This should:

1) Prompt the path you're in, in color: path_color. 2) Tell you which branch are you. 3) Color the name of the branch based on the status of the branch with git_clean_color for a clean work directory and git_dirty_color for a dirty one. 4) The brackets should stay in the default color you established in your computer. 5) Puts the prompt in the next line for readability. 

You can customize the colors with this list

Sophisticated Solution

Another option is to use Git Bash Prompt, install with this. I used the option via Homebrew on Mac OS X.

git_prompt_list_themes to see the themes but I didn't like any of them.

git_prompt_color_samples to see available colors.

git_prompt_make_custom_theme [<Name of base theme>] to create a new custom theme, this should create a .git-prompt-colors.sh file.

subl ~/.git-prompt-colors.sh to open git-prompt-colors.sh and customize:

The .git-prompt-colors.sh file should look like this with my customization

 override_git_prompt_colors() { GIT_PROMPT_THEME_NAME="Custom" # Clean or dirty branch if git diff --quiet 2>/dev/null >&2; then GIT_PROMPT_BRANCH="${Green}" else GIT_PROMPT_BRANCH="${Red}" fi } reload_git_prompt_colors "Custom" 

Hope this helps, have a great day!

2

From Mac OS Catalina .bash_profile is replaced with .zprofile

Step 1: Create a .zprofile

touch .zprofile 

Step 2:

nano .zprofile 

type below line in this

source ~/.bash_profile 

and save(ctrl+o return ctrl+x)

Step 3: Restart your terminal

To Add Git Branch Name Now you can add below lines in .bash_profile

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

Restart your terminal this will work.

Note: Even you can rename .bash_profile to .zprofile that also works.

2

Keep it fast, keep it simple

put this in your ~/.bashrc file.

git_stuff() { git_branch=$(git branch --show-current 2> /dev/null) if [[ $git_branch == "" ]];then echo -e "" elif [[ $git_branch == *"Nocommit"* ]];then echo -e "No commits" else echo -e "$git_branch" fi } prompt() { PS1="\e[2m$(date +%H:%M:%S.%3N) \e[4m$(git_stuff)\033[0m\n\w$ " } PROMPT_COMMAND=prompt 

Then source ~/.bashrc

enter image description here

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like