如何在終端實時展示git分支

在微博上看到ghosTM55在終端能夠實時展示出當前運行的分支,以爲很奇特,因而google了一把。這裏面存在兩個內容,第一個bash,第二個是githtml

 

 

bash基礎:linux

 

瞭解到linux的shell存在PS1, PS2,PS3, PS4,這些都做爲環境變量存在。git

 

PS1表示的默認交互提示,在ubuntu-12.04中的默認值是 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$",也就是咱們一般能夠看到的:shell

  damon@damon:~/pyenv/bin$ ubuntu

在PS1中bash

\u -- 表示用戶名ui

\h -- 表示主機名google

\w -- 當前目錄的全局路徑,若是是home目錄,顯示~spa

\s -- 表示的bash.net

\v -- 表示版本

 

因此你能夠修改默認的提示符:

  export PS1="\u@\h-\v \w> "

按照上面的提示,顯示的就是

  damon@damon-4.2 ~/pyenv/bin

 

一般狀況下,咱們只會用到PS1,可是當咱們須要繼續交互的時候,就會用到PS2,比方說輸入命令行使用\來進行下一行處理。例如簡單一些:

  ls \

則會出現下面的提示符號,也就是PS2的內容

>

一般咱們會用到的就這兩個

 

shell在執行PS1前,會先執行PROMPT_COMMAND這個指令,而且顯示在PS1以前。因此咱們能夠在終端的PROMPT_COMMAND上作一些操做

而後獲得顯示一些特殊的內容,也就是ghosTM55上實時顯示git分支。

 

咱們先試驗一下,修改PROMPT_COMMAND爲下面的值:

export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"

那麼提示符號將顯示爲:

[21:40:17]damon@damon:~/pyenv/bin$

注意時間是定格的

 

可使用unset方法來取消PROMPT_COMMAND

 

git基礎:

 

git是存在分支的,當前所在的git分支能夠經過git branch來察看。

 

另一種方式,獲取.git/HEAD文件中的內容,格式是:

ref: refs/heads/BRANCH-NAME

 

 

因而有兩種方案:

 

一,用下面指令替換PS1

git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'

 

可是存在問題,那就是每次shell活動,都要啓動一個git和sed的進程,開銷會有些大。

 

2、先定義一個git分支的查詢方式:

function find_git_branch {
    local dir=. head
    until [ "$dir" -ef / ]; do
        if [ -f "$dir/.git/HEAD" ]; then
            head=$(< "$dir/.git/HEAD")
            if [[ $head == ref:\ refs/heads/* ]]; then
                git_branch=" ${head#*/*/}"
            elif [[ $head != '' ]]; then
                git_branch=' (detached)'
            else
                git_branch=' (unknown)'
            fi
            return
        fi
        dir="../$dir"
    done
    git_branch=''
}

而後用下面的方法替換:

PROMPT_COMMAND="find_git_branch; $PROMPT_COMMAND"

固然最後咱們能夠用下面的方式替換PS1



這樣就能夠在PS1中的顏色知道當前的狀態。


green=$'\e[1;32m' magenta=$'\e[1;35m' normal_colours=$'\e[m' PS1="\[$green\]\u@\h:\w\[$magenta\]\$git_branch\[$green\]\\$\[$normal_colours\] "

這兒有一份相關的說明:

http://aaroncrane.co.uk/2009/03/git_branch_prompt/

這兒有另外一份中文說明:

http://blog.chinaunix.net/uid-28464347-id-3439455.html

相關文章
相關標籤/搜索