246

I'm trying to change my command promt in terminal. I keep getting the error:

-bash: __git_ps1: command not found

I've tried it just by typing it into the terminal as is: __git_ps1. I've also tried it out in the .bash_profile

if [ -f ~/.git-completion.bash ]; then
  source ~/.git-completion.bash
  export PS1='[\W]$(__git_ps1 "(%s)"): '
fi

As you might be able to see/tell, yes, I do have the auto-completion installed and it does work great!

I came across this question: " PS1 env variable does not work on mac " which gives the code

alias __git_ps1="git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/(\1)/'"

So I add it to my .bash_profile hoping that it will change something. Well, it did. It just changed the error output.

Here's the .bash_profile with the addition:

alias __git_ps1="git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/(\1)/'"

if [ -f ~/.git-completion.bash ]; then
  source ~/.git-completion.bash
  export PS1='[\W]$(__git_ps1 "(%s)"): '
fi

And now here's the changed error output:

sed: (%s): No such file or directory

Note: I've also moved the alias below the source with no difference. I have git version 1.7.12.1

This should be a simple change. Can someone please help me?

Edit 10/13/12

No, I definitely do not want to define __git_ps1 myself but was just trying to see if it would be recognized by doing so. Yes, I have the .git-completion.bash file installed. Here's how I got auto completion on my machine.

cd ~
curl -OL https://github.com/git/git/raw/master/contrib/completion/git-completion.bash
mv ~/git.completion.bash ~/.git-completion.bash

A ls -la then lists the .git-completion.bash file.

James Risner
  • 5,451
  • 11
  • 25
  • 47
Geoff
  • 3,534
  • 5
  • 30
  • 33
  • My `git-completion.bash` defines `__git_ps1` as a shell function. Does yours? How do you know completion is working? What happens when you type `git h`? – rob mayoff Oct 13 '12 at 07:51
  • When I type that, it ends up with git help[space] – Geoff Oct 13 '12 at 19:15
  • The accepted answer is good but the prompt can also be enabled by hitting `git ` as noted in the commit referenced by Mark Longair. – Jack Frost Mar 03 '13 at 20:20
  • That's not only a good explicate question, but also a helpful resource guiding to the solution. A well deserved upvote. – Yannis Dran Feb 16 '14 at 14:08
  • The -f check worked to fix this error when running bash inside of screen(1) on OS X 10.8.5. No idea why, since the file existed regardless, but thanks none the less! – Nick K9 Jun 22 '14 at 20:17
  • I added in .bashrc and then it started working. Strange! – mac Apr 07 '15 at 23:16

21 Answers21

360

You've installed the version of git-completion.bash from master - in git's development history this is after a commit that split out the __git_ps1 function from the completion functionality into a new file (git-prompt.sh). The commit that introduced this change, which explains the rationale, is af31a456.

I would still suggest that you just source the version of git-completion.bash (or git-prompt.sh) that is bundled with your installation of git.

However, if for some reason you still want to use this functionality by using scripts separately downloaded from master, you should download git-prompt.sh similarly:

curl -o ~/.git-prompt.sh \
    https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh

... and add the following line to your ~/.bash_profile:

source ~/.git-prompt.sh

Then your PS1 variable that includes __git_ps1 '%s' should work fine.

Geoff reported 10/13/12 adding the following to their .bash_profile worked while others did not:

if [ -f ~/.git-prompt.sh ]; then
  source ~/.git-prompt.sh
  export PS1='Geoff[\W]$(__git_ps1 "(%s)"): '
fi
James Risner
  • 5,451
  • 11
  • 25
  • 47
Mark Longair
  • 446,582
  • 72
  • 411
  • 327
  • You're right that I don't want to define __git_ps1 myself. I was just trying to see if it would recognize it and it does not. I do have .git-completion.bash on my root. I'll update my question above to include how I got auto completion working... – Geoff Oct 13 '12 at 19:19
  • @designer84: thanks for the extra information - I think it's clear now what the problem is, and I've updated my answer with an explanation. – Mark Longair Oct 13 '12 at 19:41
  • Why does this not work? if [ -f /usr/local/git/contrib/completion/git-completion.bash ]; then source /usr/local/git/contrib/completion/git-completion.bash export PS1='[\W]$(__git_ps1 "(%s)"): ' fi – Geoff Oct 14 '12 at 02:17
  • @designer84: I'm glad to hear that worked. The reason that including the version from your installed copy didn't work is that git 1.7.12.1 is after the split into `git-completion.bash` and `git-prompt.sh` that I described - there should also be a `.git-prompt.sh` in `/usr/local/git/contrib/completion/` – Mark Longair Oct 14 '12 at 09:17
  • I have used you method Mark. Unfortunately the moment I enter a "git directory" when I normally had a branch displayed in the prompt... The all hell breaks loose... First bash starts to lag, later the whole computer until it's gone and restart is necessary... Any idea? – op1ekun Aug 20 '13 at 08:06
  • @op1ekun: sorry, I'm not sure, I'm afraid - unless you've set one of these environment variables: https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh#L38 and the repository is a particularly large one. With those variables unset (the defaults) `__git_ps1` should be very light and fast independent of the repository, but they would cause more work to be done if set. – Mark Longair Aug 20 '13 at 08:41
  • 6
    On OSX 10.9 with git 1.8.5.3 installed via Homebrew, both `git-prompt.sh` and `git-completion.bash` are found in `\`brew --prefix git\`/etc/bash_completion.d/`. – dokkaebi Feb 10 '14 at 22:02
  • Note: You must restart Terminal to make changes take effect. It took me a while to figure it out. – Yannis Dran Feb 16 '14 at 13:43
  • 1
    In MacPorts, the path changed when the package `git-core` was replaced by `git`, see [this question](http://superuser.com/questions/769439/why-doesnt-git-ps1-work-in-bash-anymore-on-osx-with-macports) – Ramon de la Fuente Jun 16 '14 at 14:42
  • @YannisDran you can `source` the config file to avoid reloading the terminal. – Christophe Roussy Mar 25 '15 at 09:12
  • On OSX 10.10.4 with git 2.4.5 installed via Homebrew, both `git-prompt.sh` and `git-completion.bash` are found in `\`brew --prefix git\`/etc/bash_completion.d/` , just like on OSX 10.9 as @dokkaebi mentioned in a previous comment. – Martin Carel Jul 08 '15 at 21:27
  • This would ommit the current directory in Mac OS X. So, I use `PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }__git_ps1 '\u:\w' '\\\$ '"` – liudongmiao Feb 22 '16 at 08:24
  • I still get an error: **bash: __docker_machine_ps1: command not found** – IgorGanapolsky Dec 22 '16 at 18:18
  • Thanks to @dokkaebi, this works for me (macOS): `source "\`brew --prefix git\`/etc/bash_completion.d/git-prompt.sh"` – mhulse Oct 10 '19 at 00:00
61

After upgrading to OSX 10.9 Mavericks I had to reference the following files to get git shell command completion and git prompt to work again.

From my .bash_profile or similar:

if [ -f /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash ]; then
    . /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
fi

source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh

#shell prompt example
PS1='\u $(__git_ps1 "(%s)")\$ '
haysclark
  • 1,080
  • 8
  • 16
  • This was also my problem in osv 10.9 – jeremyjjbrown Jul 31 '14 at 03:23
  • While the accepted response from @marklongair is a good description, I found this question via a Google search of an error message (after upgrading to OS 10.10) and this answer is the simplest solution for my issue (simply changing the path to the new location). – RedBassett Nov 12 '14 at 08:45
  • This worked for me in 10.10.5 Yosemite, however I changed the location of git-prompt to `~/.git_prompt.sh`. The other solutions didn't work. – Rein Oct 14 '15 at 07:20
  • I added your suggested lines to **.bash_profile**, but am still getting the error: `bash: __docker_machine_ps1: command not found` – IgorGanapolsky Dec 22 '16 at 18:19
43

You should

$ brew install bash bash-completion git

Then source "$(brew --prefix)/etc/bash_completion" in your .bashrc.

Steven Shaw
  • 6,063
  • 3
  • 33
  • 44
  • 1
    Great answer, definitely the best way if git is installed with brew. But i think you need to source this: source $(brew --prefix)/etc/bash_completion.d/git-prompt.sh – febLey Oct 19 '16 at 13:34
  • 1
    @febLey Yes, the location changed. I've updated the answer. Thanks. – Steven Shaw Oct 21 '16 at 02:51
  • This doesn't work. I get errors: **bash: /usr/local/etc/bash_completion.d/git-prompt.sh: Permission denied bash: __docker_machine_ps1: command not found** – IgorGanapolsky Dec 22 '16 at 18:22
14

Following worked for me like a charm:

Run following in your Terminal:

curl -L https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh > ~/.bash_git

Open/Create bash_profile:

$ vi ~/.bash_profile

Add following to the file:

source ~/.bash_git
export PS1='\[\033[01;32m\]os \[\033[01;34m\]\w $(__git_ps1 "[%s]")\$\[\033[00m\] '
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWUPSTREAM="auto"

Finally, source it using:

$ source ~/.bash_profile

This will solve the problem of bash: __git_ps1: command not found.

Also your prompt will change to "os ". To change "os" to something else, modify "os" string in export PS1 line.

Uthman
  • 9,251
  • 18
  • 74
  • 104
  • I still get an error **sh -c "clear && /bin/bash" bash: __docker_machine_ps1: command not found** every time I enter Docker CLI. – IgorGanapolsky Dec 22 '16 at 18:24
8

Solution for MacOS Sierra and git version 2.10.1 <2017-2-06>

Step 1: Install the Git

You can skip this step if you already installed the latest git.

Download git package from browser https://git-scm.com/download/

Note: if you install with curl [option] https://... option to download, you would have to make sure your system support SSL. So for new comer, to download from browser and install directly from git installer is much easier.

Installation Verification:
  • Show where is your git directory at: which git
  • Show which version your git currently is: git --version current version should be 2.10.1.

Step 2: Add your git profile to your shell

  1. Open your shell profile:
    • nano ~/.bash_profile or nano ~/.bashrc Depends on where your modification is.
  2. Add the following code to the file:
    • source /usr/local/git/contrib/completion/git-completion.bash
    • source /usr/local/git/contrib/completion/git-prompt.sh

Note: git installation location changed from opt/ directory to usr/local/ after OSX upgrade to El Capitain, and this is why some of the old answer above doesn't work anymore in MacOS Sierra.

  1. Add the following code to your PS1 configuration:

    • Option 1: add directly to your PS1: export PS1='\w$(__git_ps1 "(%s)") > '

      I prefer this simple approach since I already know the .git-completion.bash is there in my home directory, and I can add other prompt format in the front of it. here is my personal prompt for your reference: export PS1='\t H#\! \u:\w$(__git_ps1 "{%s}") -->> '
    • Option 2: Add a selection script

    if [ -f ~/.git-completion.bash ]; then
          export PS1='\w$(__git_ps1 "(%s)") > '
    fi
  2. Save and use the profile: source ~/.bash_profile or source ~/.bashrc

Now you should see the git prompt working properly and shows which branch you are in right now.
6

High Sierra clean solution with colors !

No downloads. No brew. No Xcode

Just add it to your ~/.bashrc or ~/.bash_profile

export CLICOLOR=1
[ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh ] && . /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
export GIT_PS1_SHOWCOLORHINTS=1
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWUPSTREAM="auto"
PROMPT_COMMAND='__git_ps1 "\h:\W \u" "\\\$ "'
luzik
  • 673
  • 2
  • 7
  • 15
5

I had same problem when upgrading to Yosemite.

I just had to modify ~/.bashrc to source /usr/local/etc/bash_completion.d/git-prompt.sh instead of the old path.

then re-source your . ~/.bashrc to get the effect.

chovy
  • 72,281
  • 52
  • 227
  • 295
4

__git_ps1 for bash is now found in git-prompt.sh in /usr/local/etc/bash_completion.d on my brew installed git version 1.8.1.5

traday
  • 1,151
  • 11
  • 21
2

this works in OS 10.8 in the .bash_profile

if [ -f ~/.git-prompt.sh ]; then
  source ~/.git-prompt.sh
  export PS1='YOURNAME[\W]$(__git_ps1 "(%s)"): '
fi
slozier
  • 21
  • 3
2

For macports I had to add: source /opt/local/share/git-core/git-prompt.sh to my ./profile

velop
  • 3,102
  • 1
  • 27
  • 30
  • 1
    @IgorGanapolsky I guess you do not have **macports** installed? Simply do `touch ~/.profile`. But you obviously need a file in: /opt/local/share/git-core/git-prompt.sh – velop Dec 23 '16 at 09:32
2

If you're hoping to use Homebrew to upgrade Git and you've let your system become out-of-date in general (as I did), you may need to bring Homebrew itself up-to-date first (as per brew update: The following untracked working tree files would be overwritten by merge: thanks @chris-frisina)

First bring Homebrew into line with the current version

cd /usr/local
git fetch origin
git reset --hard origin/master

Then update Git:

brew upgrade git

Problem Solved! ;-)

Community
  • 1
  • 1
Day Davis Waterbury
  • 2,052
  • 18
  • 31
2

At least with Xcode 6, you already have git-completion.bash. It's inside the Xcode app bundle.

Just add this to your .bashrc:

source `xcode-select -p`/usr/share/git-core/git-completion.bash
jrc
  • 20,354
  • 10
  • 69
  • 64
2
  1. Download the files git-prompt.sh and git-completion.bash from this Git completion
  2. Rename the files.
  3. Move those files to your home directory.
  4. Add the source file in to the .bash_profile

    source ~/git-completion0.bash
    source ~/git-prompt0.sh
    and four to trigger the code block.
    
JCLopez
  • 101
  • 1
  • 3
1

I know it's not a real answer...

I had some strange issues with sourcing git-prompt.sh in my .bashrc so I started to look for other solution. This one: http://www.jqno.nl/post/2012/04/02/howto-display-the-current-git-branch-in-your-prompt/ doesn't use __git_ps1 and author claims it works also on Mac (for now it works perfectly on my Ubuntu and it's easy to tweak).

I hope it helps!

op1ekun
  • 1,918
  • 19
  • 26
1

I was doing the course on Udacity for git hub and was having this same issue. Here is my final code that make is work correctly.

# Change command prompt
alias __git_ps1="git branch 2>/dev/null | grep '*' | sed 's/* \ .   (.*\)/(\1)/'"

if [ -f ~/.git-completion.bash ]; then
  source ~/.git-completion.bash
  export PS1='[\W]$(__git_ps1 "(%s)"): '
fi

source ~/.git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
# '\u' adds the name of the current user to the prompt
# '\$(__git_ps1)' adds git-related stuff
# '\W' adds the name of the current directory
export PS1="$purple\u$green\$(__git_ps1)$blue \W $ $reset"

It works! https://i.stack.imgur.com/d0lvb.jpg

superheron
  • 343
  • 1
  • 3
  • 9
1

Please not that, if you haven't installed git through Xcode or home-brew, you'll likely find the bash scripts haysclarks refers to in /Library/Developer/CommandLineTools/, and not in /Applications/Xcode.app/Contents/Developer/, thus making the lines to include within .bashrc the following:

if [ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ]; then
    . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash
fi

source /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

You'll need those lines if you wish to use git-prompt as well. [1]: https://stackoverflow.com/a/20211241/4795986

Ruben Helsloot
  • 12,582
  • 6
  • 26
  • 49
Simone Chiesi
  • 91
  • 1
  • 8
1
curl -L https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh -o ~/.git-prompt.bash

[[ -f ~/.git-prompt.bash ]]       && . ~/.git-prompt.bash
# Available GIT_PS1 options/env vars

cat ~/.git-prompt.bash | grep GIT_PS1_ | sed -r 's,^\s*#.*,,' | grep -v -E '^$' | sed -r 's,^.*(GIT_PS1_[A-Z_]+).*,\1,' | sort | uniq | sed -r 's,^(.*)$,export \1=,'
export GIT_PS1_COMPRESSSPARSESTATE=
export GIT_PS1_DESCRIBE_STYLE=
export GIT_PS1_HIDE_IF_PWD_IGNORED=
export GIT_PS1_OMITSPARSESTATE=
export GIT_PS1_SHOWCOLORHINTS=
export GIT_PS1_SHOWDIRTYSTATE=
export GIT_PS1_SHOWSTASHSTATE=
export GIT_PS1_SHOWUNTRACKEDFILES=
export GIT_PS1_SHOWUPSTREAM=
export GIT_PS1_STATESEPARATOR=

for i in $(cat ~/.git-prompt.bash | grep GIT_PS1_ | sed -r 's,^\s*#.*,,' | grep -v -E '^$' | sed -r 's,^.*(GIT_PS1_[A-Z_]+).*,\1,' | sort | uniq); do varname=$i; declare -g ${i}=1; done
# P.S Above is just illustration not all config vars are [0/1].

# For more info: 

cat ~/.git-prompt.bash | sed -r -n -e '1,/^[^\s*#]/p' | head -n -2
hardeep
  • 186
  • 1
  • 7
  • A nice improvement could be to add the just previous branch you were on in a dimmed state to the prompt. – hardeep Aug 14 '21 at 10:12
0

This one worked for me, and it has colored git output and an indicator in the prompt whether files have changed / been added, right baked into it:

GIT_PS1_SHOWDIRTYSTATE=true

. /usr/local/Cellar/git/1.8.5.2/etc/bash_completion.d/git-completion.bash
. /usr/local/Cellar/git/1.8.5.2/etc/bash_completion.d/git-prompt.sh

PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '

Be sure to use the correct path! I used homebrew to install git, use brew list git to get the path to your current installation.

Would be nice not to use a hard coded path, but don't know how to get the path to the current installation.

More infos here: http://en.newinstance.it/2010/05/23/git-autocompletion-and-enhanced-bash-prompt/

Joshua Muheim
  • 12,617
  • 9
  • 76
  • 152
0

For git, there are /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh. And please look /etc/bashrc_Apple_Terminal too.

So, I put these in ~/.bash_profile:

if [ -f /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh ]; then
  . /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh
  export GIT_PS1_SHOWCOLORHINTS=1
  export GIT_PS1_SHOWDIRTYSTATE=1
  PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }__git_ps1 '\u:\w' '\\\$ '"
fi
liudongmiao
  • 455
  • 4
  • 7
0

Yet another option I just installed on Mojave: magicmonty/bash-git-prompt

Run (brew update) and brew install bash-git-prompt or brew install --HEAD bash-git-prompt

Then to your ~/.bash_profile or ~/.bashrc:

if [ -f "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh" ]; then
  __GIT_PROMPT_DIR=$(brew --prefix)/opt/bash-git-prompt/share
  GIT_PROMPT_ONLY_IN_REPO=1
  source "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh"
fi

I'm happy.

MikeiLL
  • 6,282
  • 5
  • 37
  • 68
0

Copy/Download the following files and copy them to home directory: ~/

git-completion.bash

git-prompt.sh

For the bash_profile, add this at the beginning:

source ~/git-completion.bash
source ~/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1

For more and easy downloads you could check this.