Home

Awesome

posh-git-bash

Build Status

This script allows you to see the status of the current git repository in your prompt. It replicates the prompt status from the Windows PowerShell module dahlbyk/posh-git.

Installation Instructions

  1. Optional. Install bash-completion.

  2. Copy this file to somewhere (e.g., ~/git-prompt.sh).

  3. Add the following line to your ~/.bashrc. (You may need to update your ~/.bash_profile to source your ~/.bashrc, or you can just modify ~/.bash_profile directly.)

    source ~/git-prompt.sh
    
  4. If you are using bash, you should call __posh_git_ps1 in your PROMPT_COMMAND variable. The function __posh_git_ps1 takes two parameters (__posh_git_ps1 <prefix> <suffix>), and sets PS1 to <prefix><status><suffix>. You can also use __posh_git_echo to echo only the status.

    • Bash example:
    PROMPT_COMMAND='__posh_git_ps1 "\u@\h:\w " "\\\$ ";'$PROMPT_COMMAND
    

    This shows username, at-sign, host, colon, cwd, then various status strings, followed by dollar and space, as your prompt. This invocation prepends this instruction to the existing value of PROMPT_COMMAND.

    • For zsh, you need to set the PROMPT variable or the precmd hook.
    precmd() {
      __posh_git_ps1 '%n@%m:%~ ' '$ '
    }
    

    For some additional hints for integrating with oh-my-zsh, take a look at issue #14.

Installation with Fig

Fig adds apps, shortcuts, and autocomplete to your existing terminal.

Install posh-git-sh in just one click.

<a href="https://fig.io/plugins/other/posh-git-sh_lyze" target="_blank"><img src="https://fig.io/badges/install-with-fig.svg" /></a>

The Prompt

By default, the status summary has the following format:

[{HEAD-name} x +A ~B -C !D | +E ~F -G !H W]

For example, a status of [master ≡ +0 ~2 -1 | +1 ~1 -0 !] corresponds to the following git status:

# On branch master
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#        modified:   this-changed.txt
#        modified:   this-too.txt
#        deleted:    gone.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#        modified:   not-staged.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#        new.txt

Example setup

Example usage

To get the above prompt display, I have the following in my .bashrc:

export PROMPT_COMMAND='__posh_git_ps1 "\\[\[\e[0;32m\]\u@\h \[\e[0;33m\]\w" " \[\e[1;34m\]\n\$\[\e[0m\] ";'$PROMPT_COMMAND

Try it out and let me know what you think!

Configuration Options

This script should work out of the box. You can set options controlling the output of the script by using git config. This allows you to control the prompt display on a per-repository basis.

For example, if computing file changes is taking too long in a large repository, you can turn off this behavior (for that repository only):

cd my-git-repo/
git config bash.enableFileStatus false

To restore the default behavior, you can remove the configuration setting:

cd my-git-repo/
git config --unset bash.enableFileStatus

You can also manually edit your git configuration files. These files are most likely ~/.gitconfig or .git/config. An example illustrating the syntax of these files can be found at http://git-scm.com/docs/git-config#_example.

bash.branchBehindAndAheadDisplay

This option controls whether and how to display the number of commits by which the current branch is behind or ahead of its remote.

bash.describeStyle

This option controls if you would like to see more information about the identity of commits checked out as a detached HEAD. This is also controlled by the legacy environment variable GIT_PS1_DESCRIBESTYLE.

bash.enableFileStatus

bash.enableGitStatus

bash.enableStashStatus

bash.showStatusWhenZero

bash.showUpstream

By default, __posh_git_ps1 will compare HEAD to your SVN upstream if it can find one, or @{upstream} otherwise. This is also controlled by the legacy environment variable GIT_PS1_SHOWUPSTREAM.

bash.enableStatusSymbol

Known issues

Terminal.app

When using Terminal.app, when the prompt is longer than the terminal window width, the prompt line may not wrap correctly to the next line. This is suspected to be caused by incorrect handling of ANSI color codes by Terminal.app. See issue #18.

Background

This was my first venture into bash scripting, so I decided to make a clone of posh-git, which is a set of PowerShell scripts for git integration. In my humble opinion, I think it is fantastic.

I based my work off of https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh

Please do not hesitate to contact me about any issues or requests. I hope that you may find some use for this script.

License

This is distributed under the GNU GPL v3.