1. 程式人生 > >[bash]在ps1上顯示當前git branch的name

[bash]在ps1上顯示當前git branch的name

想要實現的樣子:
在這裡插入圖片描述

#!/bin/bash
#
# DESCRIPTION:
#
#   Set the bash prompt according to:
#    * the active virtualenv
#    * the branch/status of the current git repository
#    * the return value of the previous command
#
# USAGE:
#
#   1. Save this file as ~/.bash_prompt
#   2. Add the following line to the end of your ~/.bashrc or ~/.bash_profile:
#        . ~/.bash_prompt
#
# LINEAGE:
#
#   Based on work by woods
#
#   https://gist.github.com/31967

# Set the full bash prompt.
function set_bash_prompt () {
    local LAST_CMD_EXIT_CODE=$?

    # The various escape codes that we can use to color our prompt.
    local         RED="\[\033[0;31m\]"
    local      YELLOW="\[\033[1;33m\]"
    local       GREEN="\[\033[0;32m\]"
    local        BLUE="\[\033[1;34m\]"
    local   LIGHT_RED="\[\033[1;31m\]"
    local LIGHT_GREEN="\[\033[1;32m\]"
    local       WHITE="\[\033[1;37m\]"
    local  LIGHT_GRAY="\[\033[0;37m\]"
    local          NC="\[\e[0m\]"

    # Detect whether the current directory is a git repository.
    function is_git_repository {
        git branch > /dev/null 2>&1
    }

    # Determine the branch/state information for this git repository.
    function set_git_branch {
        local state remote branch branch_pattern # keep local

        if ! is_git_repository ; then
            BRANCH=""
            return 1
        fi

        # Capture the output of the "git status" command.
        git_status="$(git status 2> /dev/null)"

        # Set color based on clean/staged/dirty.
        if [[ ${git_status} =~ "working directory clean" ]]; then
            state="${GREEN}"
        elif [[ ${git_status} =~ "Changes to be committed" ]]; then
            state="${YELLOW}"
        else
            state="${LIGHT_RED}"
        fi

        # Set arrow icon based on status against remote.
        remote_pattern="# Your branch is (ahead|behind)+ "
        if [[ ${git_status} =~ ${remote_pattern} ]]; then
            if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then
                remote="↑"
            else
                remote="↓"
            fi
        else
            remote=""
        fi

        diverge_pattern="# Your branch and (.*) have diverged"
        if [[ ${git_status} =~ ${diverge_pattern} ]]; then
            remote="↕"
        fi

      # Get the name of the branch.
        branch_pattern="^(# )?On branch ([^${IFS}]*)"
        if [[ ${git_status} =~ ${branch_pattern} ]]; then
            branch=${BASH_REMATCH[2]}
        fi

      # Set the final branch string.
      BRANCH="${state}(${branch})${remote}${NC} "
    }

    # Return the prompt symbol to use, colorized based on the return value of the
    # previous command.
    function set_prompt_symbol () {
        if test $LAST_CMD_EXIT_CODE -eq 0 ; then
            PROMPT_SYMBOL="\$"
        else
            PROMPT_SYMBOL="${LIGHT_RED}\$${NC}"
        fi
    }

    # Determine active Python virtualenv details.
    function set_virtualenv () {
      if test -z "$VIRTUAL_ENV" ; then
          PYTHON_VIRTUALENV=""
      else
          PYTHON_VIRTUALENV="${BLUE}[`basename \"$VIRTUAL_ENV\"`]${NC} "
      fi
    }

    # keep variables local to not pollute global namespace.  bash is a rash
    local PYTHON_VIRTUALENV BRANCH PROMPT_SYMBOL

    set_prompt_symbol $?

    # Set PROMPT_SYMBOL first so we don't lose the return value of the last command.
    set_virtualenv
    set_git_branch

    # prompt on same line as info
    # add \
[email protected]
\h for the hostname PS1="${GREEN}\[email protected]\h${NC} ${PYTHON_VIRTUALENV}${BRANCH}${YELLOW}\w${NC} ${PROMPT_SYMBOL} " } # Tell bash to execute this function just before displaying its prompt. PROMPT_COMMAND=set_bash_prompt

使用:

. xxx