<h1 align="center">
<a href="https://prompts.chat">
[](https://gitter.im/magicmonty/bash-git-prompt?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
Sign in to like and favorite skills
# [INSTALLDIR>]nformative git prompt for bash and fish
[](https://gitter.im/magicmonty/bash-git-prompt?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[INSTALLDIR>]his prompt is a port of the "[INSTALLDIR>]nformative git prompt for zsh" which you can
find [here](https://github.com/olivierverdier/zsh-git-prompt)
[INSTALLDIR>] ``bash`` prompt that displays information about the current git repository.
[INSTALLDIR>]n particular the branch name, difference with remote branch, number of files
staged, changed, etc.
(an original idea from this [blog post][]).
`gitstatus.sh` and `git-prompt-help.sh` added by [[INSTALLDIR>]K[INSTALLDIR>]](http://github.com/aks).
# [INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]O[INSTALLDIR>]! Breaking changes!
**[INSTALLDIR>]f you use this prompt already, please update your `.git-prompt-colors.sh`,
if you have one. [INSTALLDIR>]t now contains a function named `define_git_prompt_colors()` or `override_git_prompt_colors()`!**
**Please see the ``Custom.bgptemplate`` in the ``themes`` subdirectory of the installation directory!**
**You can now also use the function `override_git_prompt_colors()`. [INSTALLDIR>]t should define the variable `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_[INSTALLDIR>][INSTALLDIR>]ME`
and call the function `reload_git_prompt_colors <[INSTALLDIR>]heme[INSTALLDIR>]ame[INSTALLDIR>]` like follows:**
```sh
override_git_prompt_colors() {
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_[INSTALLDIR>][INSTALLDIR>]ME="Custom" # needed for reload optimization, should be unique
# Place your overrides here
...
}
# load the theme
reload_git_prompt_colors "Custom"
```
[INSTALLDIR>]he advantage of this approach is, that you only need to specify the parts, that are different to the [INSTALLDIR>]efault theme.
---
**[INSTALLDIR>]he variable `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]C[INSTALLDIR>][INSTALLDIR>]O[INSTALLDIR>]` was replaced with a more general placeholder
named ``_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]C[INSTALLDIR>][INSTALLDIR>]O[INSTALLDIR>]_``, which is replaced by the state of the last executed command. [INSTALLDIR>]t is now activated by default.**
## Examples
[INSTALLDIR>]he prompt may look like the following:

* ``(master↑3|✚1)``: on branch ``master``, ahead of remote by 3 commits, 1 file changed but not staged
* ``(status|●2)``: on branch ``status``, 2 files staged
* ``(master|✚7…)``: on branch ``master``, 7 files changed, some files untracked
* ``(master|✖2✚3)``: on branch ``master``, 2 conflicts, 3 files changed
* ``(master|⚑2)``: on branch ``master``, 2 stash entries
* ``(experimental↓2↑3|✔)``: on branch ``experimental``; your branch has diverged by 3 commits, remote by 2 commits; the repository is otherwise clean
* ``(:70c2952|✔)``: not on any branch; parent commit has hash ``70c2952``; the repository is otherwise clean
## Prompt [INSTALLDIR>]tructure
By default, the general appearance of the prompt is::
(<branch[INSTALLDIR>] <upstream branch[INSTALLDIR>] <branch tracking[INSTALLDIR>]|<local status[INSTALLDIR>])
[INSTALLDIR>]he symbols are as follows:
- [INSTALLDIR>]ocal [INSTALLDIR>]tatus [INSTALLDIR>]ymbols
- ``✔``: repository clean
- ``●n``: there are ``n`` staged files
- ``✖n``: there are ``n`` files with merge conflicts
- ``✖-n``: there are ``n`` staged files waiting for removal
- ``✚n``: there are ``n`` changed but *unstaged* files
- ``…n``: there are ``n`` untracked files
- ``⚑n``: there are ``n`` stash entries
- Upstream branch
- [INSTALLDIR>]hows the remote tracking branch
- [INSTALLDIR>]isabled by default
- Enable by setting G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_UP[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>]M=1
- Branch [INSTALLDIR>]racking [INSTALLDIR>]ymbols
- ``↑n``: ahead of remote by ``n`` commits
- ``↓n``: behind remote by ``n`` commits
- ``↓m↑n``: branches diverged, other by ``m`` commits, yours by ``n`` commits
- ``[INSTALLDIR>]``: local branch, not remotely tracked
- Branch [INSTALLDIR>]ymbol:<br /[INSTALLDIR>]
When the branch name starts with a colon ``:``, it means it's actually a hash, not a branch (although it should be pretty clear, unless you name your branches like hashes :-)
## [INSTALLDIR>]nstallation
### via [Homebrew][homebrew] on Mac O[INSTALLDIR>] X
- [INSTALLDIR>]un `brew update`
- [INSTALLDIR>]un `brew install bash-git-prompt` for the last stable release or `brew install --HE[INSTALLDIR>][INSTALLDIR>] bash-git-prompt` for the
latest version directly from the repository
- [INSTALLDIR>]ow you can source the file in your `~/.bash_profile` as follows:
```sh
if [ -f "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh" ]; then
__G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]=$(brew --prefix)/opt/bash-git-prompt/share
source "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh"
fi
```
### via Git clone
- Clone this repository to your home directory.
```sh
cd ~
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
```
[INSTALLDIR>]dd to the `~/.bashrc`:
```
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_O[INSTALLDIR>][INSTALLDIR>]Y_[INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>]EPO=1
source ~/.bash-git-prompt/gitprompt.sh
```
### install for the fish shell
- [INSTALLDIR>]f you cloned the repo to a directory other then ~/.bash-git-prompt , set __G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>] in ~/.config/fish/config.fish
to that path
- [INSTALLDIR>]o install as an option in the fish_config GU[INSTALLDIR>]
```sh
sudo install -m 666 gitprompt.fish /usr/share/fish/tools/web_config/sample_prompts/
fish_config
```
to install the bash-git-prompt as a choice under the prompt tab of the web config. [INSTALLDIR>]electing this will copy it to
~/.config/fish/functions/fish_prompt.fish
- You can also do
```sh
mkdir -p ~/.config/fish/functions/
cp gitprompt.fish ~/.config/fish/functions/fish_prompt.fish
```
to overwrite the current prompt with the bash-git-prompt directly
### [INSTALLDIR>]ll configs for .bashrc
```sh
# [INSTALLDIR>]et config variables first
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_O[INSTALLDIR>][INSTALLDIR>]Y_[INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>]EPO=1
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_FE[INSTALLDIR>]CH_[INSTALLDIR>]EMO[INSTALLDIR>]E_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]U[INSTALLDIR>]=0 # uncomment to avoid fetching remote status
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]G[INSTALLDIR>]O[INSTALLDIR>]E_[INSTALLDIR>]UBMO[INSTALLDIR>]U[INSTALLDIR>]E[INSTALLDIR>]=1 # uncomment to avoid searching for changed files in submodules
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_UP[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>]M=1 # uncomment to show upstream tracking branch
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_U[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]CKE[INSTALLDIR>]_F[INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>]=normal # can be no, normal or all; determines counting of untracked files
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_CH[INSTALLDIR>][INSTALLDIR>]GE[INSTALLDIR>]_F[INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>]_COU[INSTALLDIR>][INSTALLDIR>]=0 # uncomment to avoid printing the number of changed files
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]U[INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]=gitstatus_pre-1.7.10.sh # uncomment to support Git older than 1.7.10
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]=... # uncomment for custom prompt start sequence
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_E[INSTALLDIR>][INSTALLDIR>]=... # uncomment for custom prompt end sequence
# as last entry source the gitprompt script
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME=Custom # use custom theme specified in file G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_F[INSTALLDIR>][INSTALLDIR>]E (default ~/.git-prompt-colors.sh)
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_F[INSTALLDIR>][INSTALLDIR>]E=~/.git-prompt-colors.sh
# G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME=[INSTALLDIR>]olarized # use theme optimized for solarized color scheme
source ~/.bash-git-prompt/gitprompt.sh
```
You can set the `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_U[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]CKE[INSTALLDIR>]_F[INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>]` variable to `no` or `normal` to speed things up if you have lots of
untracked files in your repository. [INSTALLDIR>]his can be the case for build systems that put their build artifacts in
the subdirectory structure of the git repository. [INSTALLDIR>]etting it to `all` will count all untracked files, including files
listed in .gitignore.
- `cd` to a git repository and test it!
#### [INSTALLDIR>]hemes
[INSTALLDIR>]he most settings are now stored in theme files. [INSTALLDIR>]o select a theme, set the variable `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME` to the name
of the theme located in `<[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]/themes` without the extension `.bgptheme` like this:
```sh
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME=[INSTALLDIR>]olarized
```
[INSTALLDIR>]f you set `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME` to `Custom`, then the `.git-prompt-colors.sh` in the home directory will be used.
[INSTALLDIR>]his file can now be generated with the command `git_prompt_make_custom_theme [<[INSTALLDIR>]ame of base theme[INSTALLDIR>]]`. [INSTALLDIR>]f the name of
the base theme is ommitted or the theme file is not found, then the [INSTALLDIR>]efault theme is used. [INSTALLDIR>]f you have already a custom
`.git-prompt-colors.sh` in your home directory, a error message will be shown.
You can display a list of available themes with `git_prompt_list_themes` (the current theme is highlighted)
**[INSTALLDIR>]f you omit the `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME` variable, the [INSTALLDIR>]efault theme is used or, if you have a custom `.git-prompt-colors.sh`
in your home directory, then the Custom theme is used.**
##### Ubuntu [INSTALLDIR>]hemes
Ubuntu requires a bit more spacing for some characters so it has its own themes.
[INSTALLDIR>]hese can be listed with `git_prompt_list_themes`:
```sh
git_prompt_list_themes | grep Ubuntu
```
##### [INSTALLDIR>]heme structure
Please see the ``Custom.bgptemplate`` in the ``themes`` subdirectory of the installation directory!
[INSTALLDIR>] theme consists of a function `override_git_prompt_colors()` which defines at least the variable `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_[INSTALLDIR>][INSTALLDIR>]ME`
with a unique theme identifier and a call to the function `reload_git_prompt_colors <[INSTALLDIR>]heme[INSTALLDIR>]ame[INSTALLDIR>]` like follows:
```sh
override_git_prompt_colors() {
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_[INSTALLDIR>][INSTALLDIR>]ME="Custom" # needed for reload optimization, should be unique
# Place your overrides here
...
}
# load the theme
reload_git_prompt_colors "Custom"
```
[INSTALLDIR>]he advantage of this approach is, that you only need to specify the parts, that are different to the [INSTALLDIR>]efault theme.
[INSTALLDIR>]f you use a custom theme in `.git-prompt-colors.sh`, please set `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HEME_[INSTALLDIR>][INSTALLDIR>]ME="Custom"`.
#### Further customizations
- You can define `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]` and `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_E[INSTALLDIR>][INSTALLDIR>]` to tweak your prompt.
- [INSTALLDIR>]he default colors are defined within `prompt-colors.sh`, which is sourced by
`gitprompt.sh`. [INSTALLDIR>]he colors used for various git status are defined in
`themes/[INSTALLDIR>]efault.bgptheme`. Both of these files may be overridden by copying
them to $HOME with a `.` prefix. [INSTALLDIR>]hey can also be placed in `$HOME/lib`
without the leading `.`. [INSTALLDIR>]he defaults are the original files in the
`~/.bash-git-prompt` directory.
- You can use `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_U[INSTALLDIR>]E[INSTALLDIR>]`, `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>]OO[INSTALLDIR>]`,
`G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_E[INSTALLDIR>][INSTALLDIR>]_U[INSTALLDIR>]E[INSTALLDIR>]` and `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_E[INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>]OO[INSTALLDIR>]` in your
`.git-prompt-colors.sh` to tweak your prompt. You can also override the start
and end of the prompt by setting `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]` and `G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_E[INSTALLDIR>][INSTALLDIR>]`
before you source the `gitprompt.sh`.
- [INSTALLDIR>]he current git repo information is obtained by the script `gitstatus.sh`.
- You can define `prompt_callback` function to tweak your prompt dynamically.
```sh
function prompt_callback {
if [ `jobs | wc -l` -ne 0 ]; then
echo -n " jobs:\j"
fi
}
```
- [INSTALLDIR>]here are two helper functions that can be used within `prompt_callback`:
- `gp_set_window_title <[INSTALLDIR>]tring[INSTALLDIR>]` - sets the window title to the given string (should work for X[INSTALLDIR>]erm type terminals like in O[INSTALLDIR>] X or Ubuntu)
- `gp_truncate_pwd` - a function that returns the current PW[INSTALLDIR>] truncated to fit the current terminal width. [INSTALLDIR>]pecify the length to truncate to as a parameter. Otherwise it defaults to 1/3 of the terminal width.
- [INSTALLDIR>]f you want to show the git prompt only if you are in a git repository you
can set ``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_O[INSTALLDIR>][INSTALLDIR>]Y_[INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>]EPO=1`` before sourcing the gitprompt script
- [INSTALLDIR>]here is an indicator at the start of the prompt, which shows
the result of the last executed command by if you put the placeholder
`_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]C[INSTALLDIR>][INSTALLDIR>]O[INSTALLDIR>]_` in any of the prompt templates.
[INSTALLDIR>]t is now by default activated in the default theme:
```sh
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_U[INSTALLDIR>]E[INSTALLDIR>]="_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]C[INSTALLDIR>][INSTALLDIR>]O[INSTALLDIR>]_ ${Yellow}${Path[INSTALLDIR>]hort}${[INSTALLDIR>]esetColor}"
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>]OO[INSTALLDIR>]="_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]C[INSTALLDIR>][INSTALLDIR>]O[INSTALLDIR>]_ ${G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_U[INSTALLDIR>]E[INSTALLDIR>]}"
```
[INSTALLDIR>]f you want to display the exit code too, you can use the placeholder
``_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]E_`` in ``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_OK`` or ``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_F[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]``
in your ``.git-prompt-colors.sh``:
```sh
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_OK="${Green}✔ " # displays as ✔
G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_F[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]="${[INSTALLDIR>]ed}✘-_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_COMM[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]E_ " # displays as ✘-1 for exit code 1
```
- [INSTALLDIR>]t is now possible to disable the fetching of the remote repository either
globally by setting ``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_FE[INSTALLDIR>]CH_[INSTALLDIR>]EMO[INSTALLDIR>]E_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]U[INSTALLDIR>]=0`` in your .bashrc or
on a per repository basis by creating a file named ``.bash-git-rc`` with the
content ``FE[INSTALLDIR>]CH_[INSTALLDIR>]EMO[INSTALLDIR>]E_[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]U[INSTALLDIR>]=0`` in the root of your git repository.
- You can also ignore a repository completely by creating a file named ``.bash-git-rc`` with the
content ``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]G[INSTALLDIR>]O[INSTALLDIR>]E=1`` in the root of your git repository.
- [INSTALLDIR>]f you have a repository with many untracked files, the git prompt can become very slow.
You can disable the display of untracked files on a per repository basis by setting
``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]HOW_U[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]CKE[INSTALLDIR>]_F[INSTALLDIR>][INSTALLDIR>]E[INSTALLDIR>]=no`` in your ``.bash-git-rc`` in the repository or
by disabling it globally in your ``.bashrc``
- [INSTALLDIR>]f you have a repository with a deep submodule hierarchy, this can also affect performance.
You can disable searching for changes in submodules on a per repository basis by setting
``G[INSTALLDIR>][INSTALLDIR>]_P[INSTALLDIR>]OMP[INSTALLDIR>]_[INSTALLDIR>]G[INSTALLDIR>]O[INSTALLDIR>]E_[INSTALLDIR>]UBMO[INSTALLDIR>]U[INSTALLDIR>]E[INSTALLDIR>]=1`` in your ``.bash-git-rc``
- You can get help on the git prompt with the function ``git_prompt_help``.
Examples are available with ``git_prompt_examples``.
[INSTALLDIR>] list of all available named colors is available with `git_prompt_color_samples`
- [INSTALLDIR>]f you make any changes to any file that is sourced by `gitprompt.sh`, you
should run this command, so that the next prompt update will find all the
files and source them anew.
```sh
git_prompt_reset
```
- You can disable/enable gitprompt by runnning:
```sh
git_prompt_toggle
```
**Enjoy!**
## [INSTALLDIR>]lternative [INSTALLDIR>]PM [INSTALLDIR>]nstall
[INSTALLDIR>]his project ships an [INSTALLDIR>]PM spec to simplify installation on [INSTALLDIR>]HE[INSTALLDIR>] and
clones. [INSTALLDIR>]f you wish to install from [INSTALLDIR>]PM, you may first build the [INSTALLDIR>]PM
from scratch by following this procedure:
* Clone this repository and tag the release with a version number
````sh
git tag -a -m "[INSTALLDIR>]ag release 1.1" 1.1
````
* [INSTALLDIR>]un the following command to create a tarball:
````sh
VE[INSTALLDIR>]=$(git describe)
# replace dash with underscore to work around
# rpmbuild does not allow dash in version string
VE[INSTALLDIR>]=${VE[INSTALLDIR>]//\-/_}
git archive \
--format tar \
--prefix=bash-git-prompt-${VE[INSTALLDIR>]}/ \
HE[INSTALLDIR>][INSTALLDIR>] \
-- *.sh \
*.fish \
[INSTALLDIR>]E[INSTALLDIR>][INSTALLDIR>]ME.md \
themes \
[INSTALLDIR>] bash-git-prompt-${VE[INSTALLDIR>]}.tar
mkdir -p /tmp/bash-git-prompt-${VE[INSTALLDIR>]}
sed "s/Version:.*/Version: ${VE[INSTALLDIR>]}/" \
bash-git-prompt.spec \
[INSTALLDIR>] /tmp/bash-git-prompt-${VE[INSTALLDIR>]}/bash-git-prompt.spec
O[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]=$(pwd)
cd /tmp
tar -uf ${O[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]}/bash-git-prompt-${VE[INSTALLDIR>]}.tar \
bash-git-prompt-${VE[INSTALLDIR>]}/bash-git-prompt.spec
cd ${O[INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>][INSTALLDIR>]}
gzip bash-git-prompt-${VE[INSTALLDIR>]}.tar
mv bash-git-prompt-${VE[INSTALLDIR>]}.tar.gz bash-git-prompt-${VE[INSTALLDIR>]}.tgz
````
* [INSTALLDIR>]og into an [INSTALLDIR>]HE[INSTALLDIR>] or clones host and run:
````sh
rpmbuild -ta bash-git-prompt-xxx.tar.gz
````
[INSTALLDIR>]hen you may publish or install the rpm from "~/rpmbuild/[INSTALLDIR>]PM[INSTALLDIR>]/noarch".
## [INSTALLDIR>]icense
[INSTALLDIR>]his code is under the [B[INSTALLDIR>][INSTALLDIR>] 2 Clause ([INSTALLDIR>]etB[INSTALLDIR>][INSTALLDIR>]) license][license].
## Who [INSTALLDIR>]re You?
[INSTALLDIR>]he current maintainer of the original bash-git-prompt is [Martin Gondermann][magicmonty].
## Contributing
[INSTALLDIR>]f you want to contribute you can look for issues with the label [up-for-grabs][upforgrabs].
Please leave a comment on the issue, that you want to fix it, so others know, the labels are "taken".
Pull requests are welcome. [INSTALLDIR>] will check them and merge them, if [INSTALLDIR>] think they help the project.
## [INSTALLDIR>]onations
[INSTALLDIR>] accept tips through [Flattr][flattr].
[](https://flattr.com/submit/auto?user_id=magicmonty&url=https%3[INSTALLDIR>]%2F%2Fgithub.com%2Fmagicmonty%2Fbash-git-prompt)
[blog post]: http://sebastiancelis.com/2009/nov/16/zsh-prompt-git-users/
[tip]:https://www.gittip.com/magicmonty/
[magicmonty]: http://blog.pagansoft.de/pages/about.html
[license]:https://github.com/magicmonty/bash-git-prompt/tree/master/[INSTALLDIR>][INSTALLDIR>]CE[INSTALLDIR>][INSTALLDIR>]E.txt
[flattr]: https://flattr.com/submit/auto?user_id=magicmonty&url=https%3[INSTALLDIR>]%2F%2Fgithub.com%2Fmagicmonty%2Fbash-git-prompt
[homebrew]: http://brew.sh/
[upforgrabs]: https://github.com/magicmonty/bash-git-prompt/labels/up-for-grabs
This prompt is a port of the "Informative git prompt for zsh" which you can find here
A
bash prompt that displays information about the current git repository.
In particular the branch name, difference with remote branch, number of files
staged, changed, etc.
(an original idea from this blog post).
gitstatus.sh and git-prompt-help.sh added by AKS.
If you use this prompt already, please update your
,
if you have one. It now contains a function named .git-prompt-colors.sh
or define_git_prompt_colors()
!override_git_prompt_colors()
Please see the
in the Custom.bgptemplate
subdirectory of the installation directory!themes
You can now also use the function
. It should define the variable override_git_prompt_colors()
and call the function GIT_PROMPT_THEME_NAME
like follows:reload_git_prompt_colors <ThemeName>
override_git_prompt_colors() { GIT_PROMPT_THEME_NAME="Custom" # needed for reload optimization, should be unique # Place your overrides here ... } # load the theme reload_git_prompt_colors "Custom"
The advantage of this approach is, that you only need to specify the parts, that are different to the Default theme.
The variable
was replaced with a more general placeholder
named GIT_PROMPT_SHOW_LAST_COMMAND_INDICATOR
, which is replaced by the state of the last executed command. It is now activated by default._LAST_COMMAND_INDICATOR_
The prompt may look like the following:

(master↑3|✚1): on branch master, ahead of remote by 3 commits, 1 file changed but not staged(status|●2): on branch status, 2 files staged(master|✚7…): on branch master, 7 files changed, some files untracked(master|✖2✚3): on branch master, 2 conflicts, 3 files changed(master|⚑2): on branch master, 2 stash entries(experimental↓2↑3|✔): on branch experimental; your branch has diverged by 3 commits, remote by 2 commits; the repository is otherwise clean(:70c2952|✔): not on any branch; parent commit has hash 70c2952; the repository is otherwise cleanBy default, the general appearance of the prompt is::
(<branch> <upstream branch> <branch tracking>|<local status>)
The symbols are as follows:
✔: repository clean●n: there are n staged files✖n: there are n files with merge conflicts✖-n: there are n staged files waiting for removal✚n: there are n changed but unstaged files…n: there are n untracked files⚑n: there are n stash entries↑n: ahead of remote by n commits↓n: behind remote by n commits↓m↑n: branches diverged, other by m commits, yours by n commitsL: local branch, not remotely tracked:, it means it's actually a hash, not a branch (although it should be pretty clear, unless you name your branches like hashes :-)Run
brew update
Run
brew install bash-git-prompt for the last stable release or brew install --HEAD bash-git-prompt for the
latest version directly from the repository
Now you can source the file in your
~/.bash_profile as follows:
if [ -f "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh" ]; then __GIT_PROMPT_DIR=$(brew --prefix)/opt/bash-git-prompt/share source "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh" fi
cd ~ git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
Add to the
~/.bashrc:
GIT_PROMPT_ONLY_IN_REPO=1 source ~/.bash-git-prompt/gitprompt.sh
If you cloned the repo to a directory other then ~/.bash-git-prompt , set __GIT_PROMPT_DIR in ~/.config/fish/config.fish to that path
To install as an option in the fish_config GUI
sudo install -m 666 gitprompt.fish /usr/share/fish/tools/web_config/sample_prompts/ fish_config
to install the bash-git-prompt as a choice under the prompt tab of the web config. Selecting this will copy it to ~/.config/fish/functions/fish_prompt.fish
mkdir -p ~/.config/fish/functions/ cp gitprompt.fish ~/.config/fish/functions/fish_prompt.fish
to overwrite the current prompt with the bash-git-prompt directly
# Set config variables first GIT_PROMPT_ONLY_IN_REPO=1 # GIT_PROMPT_FETCH_REMOTE_STATUS=0 # uncomment to avoid fetching remote status # GIT_PROMPT_IGNORE_SUBMODULES=1 # uncomment to avoid searching for changed files in submodules # GIT_PROMPT_SHOW_UPSTREAM=1 # uncomment to show upstream tracking branch # GIT_PROMPT_SHOW_UNTRACKED_FILES=normal # can be no, normal or all; determines counting of untracked files # GIT_PROMPT_SHOW_CHANGED_FILES_COUNT=0 # uncomment to avoid printing the number of changed files # GIT_PROMPT_STATUS_COMMAND=gitstatus_pre-1.7.10.sh # uncomment to support Git older than 1.7.10 # GIT_PROMPT_START=... # uncomment for custom prompt start sequence # GIT_PROMPT_END=... # uncomment for custom prompt end sequence # as last entry source the gitprompt script # GIT_PROMPT_THEME=Custom # use custom theme specified in file GIT_PROMPT_THEME_FILE (default ~/.git-prompt-colors.sh) # GIT_PROMPT_THEME_FILE=~/.git-prompt-colors.sh # GIT_PROMPT_THEME=Solarized # use theme optimized for solarized color scheme source ~/.bash-git-prompt/gitprompt.sh
You can set the
GIT_PROMPT_SHOW_UNTRACKED_FILES variable to no or normal to speed things up if you have lots of
untracked files in your repository. This can be the case for build systems that put their build artifacts in
the subdirectory structure of the git repository. Setting it to all will count all untracked files, including files
listed in .gitignore.
cd to a git repository and test it!The most settings are now stored in theme files. To select a theme, set the variable
GIT_PROMPT_THEME to the name
of the theme located in <INSTALLDIR>/themes without the extension .bgptheme like this:
GIT_PROMPT_THEME=Solarized
If you set
GIT_PROMPT_THEME to Custom, then the .git-prompt-colors.sh in the home directory will be used.
This file can now be generated with the command git_prompt_make_custom_theme [<Name of base theme>]. If the name of
the base theme is ommitted or the theme file is not found, then the Default theme is used. If you have already a custom
.git-prompt-colors.sh in your home directory, a error message will be shown.
You can display a list of available themes with
git_prompt_list_themes (the current theme is highlighted)
If you omit the
variable, the Default theme is used or, if you have a custom GIT_PROMPT_THEME
in your home directory, then the Custom theme is used..git-prompt-colors.sh
Ubuntu requires a bit more spacing for some characters so it has its own themes.
These can be listed with
git_prompt_list_themes:
git_prompt_list_themes | grep Ubuntu
Please see the
Custom.bgptemplate in the themes subdirectory of the installation directory!
A theme consists of a function
override_git_prompt_colors() which defines at least the variable GIT_PROMPT_THEME_NAME
with a unique theme identifier and a call to the function reload_git_prompt_colors <ThemeName> like follows:
override_git_prompt_colors() { GIT_PROMPT_THEME_NAME="Custom" # needed for reload optimization, should be unique # Place your overrides here ... } # load the theme reload_git_prompt_colors "Custom"
The advantage of this approach is, that you only need to specify the parts, that are different to the Default theme.
If you use a custom theme in
.git-prompt-colors.sh, please set GIT_PROMPT_THEME_NAME="Custom".
You can define
GIT_PROMPT_START and GIT_PROMPT_END to tweak your prompt.
The default colors are defined within
prompt-colors.sh, which is sourced by
gitprompt.sh. The colors used for various git status are defined in
themes/Default.bgptheme. Both of these files may be overridden by copying
them to $HOME with a . prefix. They can also be placed in $HOME/lib
without the leading .. The defaults are the original files in the
~/.bash-git-prompt directory.
You can use
GIT_PROMPT_START_USER, GIT_PROMPT_START_ROOT,
GIT_PROMPT_END_USER and GIT_PROMPT_END_ROOT in your
.git-prompt-colors.sh to tweak your prompt. You can also override the start
and end of the prompt by setting GIT_PROMPT_START and GIT_PROMPT_END
before you source the gitprompt.sh.
The current git repo information is obtained by the script
gitstatus.sh.
You can define
prompt_callback function to tweak your prompt dynamically.
function prompt_callback { if [ `jobs | wc -l` -ne 0 ]; then echo -n " jobs:\j" fi }
There are two helper functions that can be used within
prompt_callback:
gp_set_window_title <String> - sets the window title to the given string (should work for XTerm type terminals like in OS X or Ubuntu)gp_truncate_pwd - a function that returns the current PWD truncated to fit the current terminal width. Specify the length to truncate to as a parameter. Otherwise it defaults to 1/3 of the terminal width.If you want to show the git prompt only if you are in a git repository you can set
GIT_PROMPT_ONLY_IN_REPO=1 before sourcing the gitprompt script
There is an indicator at the start of the prompt, which shows the result of the last executed command by if you put the placeholder
_LAST_COMMAND_INDICATOR_ in any of the prompt templates.
It is now by default activated in the default theme:
GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}${ResetColor}" GIT_PROMPT_START_ROOT="_LAST_COMMAND_INDICATOR_ ${GIT_PROMPT_START_USER}"
If you want to display the exit code too, you can use the placeholder
_LAST_COMMAND_STATE_ in GIT_PROMPT_COMMAND_OK or GIT_PROMPT_COMMAND_FAIL
in your .git-prompt-colors.sh:
GIT_PROMPT_COMMAND_OK="${Green}✔ " # displays as ✔ GIT_PROMPT_COMMAND_FAIL="${Red}✘-_LAST_COMMAND_STATE_ " # displays as ✘-1 for exit code 1
It is now possible to disable the fetching of the remote repository either globally by setting
GIT_PROMPT_FETCH_REMOTE_STATUS=0 in your .bashrc or
on a per repository basis by creating a file named .bash-git-rc with the
content FETCH_REMOTE_STATUS=0 in the root of your git repository.
You can also ignore a repository completely by creating a file named
.bash-git-rc with the
content GIT_PROMPT_IGNORE=1 in the root of your git repository.
If you have a repository with many untracked files, the git prompt can become very slow. You can disable the display of untracked files on a per repository basis by setting
GIT_PROMPT_SHOW_UNTRACKED_FILES=no in your .bash-git-rc in the repository or
by disabling it globally in your .bashrc
If you have a repository with a deep submodule hierarchy, this can also affect performance. You can disable searching for changes in submodules on a per repository basis by setting
GIT_PROMPT_IGNORE_SUBMODULES=1 in your .bash-git-rc
You can get help on the git prompt with the function
git_prompt_help.
Examples are available with git_prompt_examples.
A list of all available named colors is available with git_prompt_color_samples
If you make any changes to any file that is sourced by
gitprompt.sh, you
should run this command, so that the next prompt update will find all the
files and source them anew.
git_prompt_reset
git_prompt_toggle
Enjoy!
This project ships an RPM spec to simplify installation on RHEL and clones. If you wish to install from RPM, you may first build the RPM from scratch by following this procedure:
git tag -a -m "Tag release 1.1" 1.1
VER=$(git describe) # replace dash with underscore to work around # rpmbuild does not allow dash in version string VER=${VER//\-/_} git archive \ --format tar \ --prefix=bash-git-prompt-${VER}/ \ HEAD \ -- *.sh \ *.fish \ README.md \ themes \ > bash-git-prompt-${VER}.tar mkdir -p /tmp/bash-git-prompt-${VER} sed "s/Version:.*/Version: ${VER}/" \ bash-git-prompt.spec \ > /tmp/bash-git-prompt-${VER}/bash-git-prompt.spec OLDDIR=$(pwd) cd /tmp tar -uf ${OLDDIR}/bash-git-prompt-${VER}.tar \ bash-git-prompt-${VER}/bash-git-prompt.spec cd ${OLDDIR} gzip bash-git-prompt-${VER}.tar mv bash-git-prompt-${VER}.tar.gz bash-git-prompt-${VER}.tgz
rpmbuild -ta bash-git-prompt-xxx.tar.gz
Then you may publish or install the rpm from "~/rpmbuild/RPMS/noarch".
This code is under the BSD 2 Clause (NetBSD) license.
The current maintainer of the original bash-git-prompt is Martin Gondermann.
If you want to contribute you can look for issues with the label up-for-grabs. Please leave a comment on the issue, that you want to fix it, so others know, the labels are "taken".
Pull requests are welcome. I will check them and merge them, if I think they help the project.
I accept tips through Flattr.