如何在终端实时的展示当前所处的git分支?这里主要是在linux的shell中的PS1, PS2,PS3, PS4这些环境变量中动手脚达到这个目的,现在记录一下操作过程备忘。
实际效果如下图:
先来说说linux shell中的PS1,PS2,PS3,PS4 这几个环境变量。
注意:以下操作都是在 ~/.bashrc 文件。
PS1表示的默认交互提示,在ubuntu-12.04中的默认值是
"\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$"
也就是我们通常可以看到的:
yhm@yhm-pc:~/www.phpernote.com$
在PS1中
\u -- 表示用户名
\h -- 表示主机名
\w -- 当前目录的全局路径,如果是home目录,显示~
\s -- 表示的bash
\v -- 表示版本
所以你可以修改默认的提示符:
export PS1="\u@\h-\v \w> "
按照上面的提示,显示的就是
yhm@yhm-pc-4.2 ~/www.phpernote.com
通常情况下,我们只会用到PS1,但是当我们需要继续交互的时候,就会用到PS2,比方说输入命令行使用\来进行下一行处理。例如简单一些:
ls \
则会出现下面的提示符号,也就是PS2的内容
>
通常我们会用到的就这两个。
shell在执行PS1前,会先执行 PROMPT_COMMAND 这个指令,并且显示在PS1之前。所以我们可以在终端的 PROMPT_COMMAND 上做一些操作以达到我们本文的目的,实时显示当前所处的git分支。
我们先试验一下,修改 PROMPT_COMMAND 为下面的值:
export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"
那么提示符号将显示为:
[21:40:17]yhm@yhm-pc:~/www.phpernote.com$
注意时间是定格的
可以使用unset方法来取消 PROMPT_COMMAND
git基础:
git是存在分支的,当前所在的git分支可以通过git branch来察看。
另外一种方式,获取.git/HEAD文件中的内容,格式是:
ref: refs/heads/当前分支名称
现在来说一下具体的实现在终端实时展现git分支操作:
直接将如下代码拷贝到 ~/.bashrc 文件的最末行中去即可(也即追加到该文件中)。
#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='' } function myPS1() { find_git_branch green=$'\e[1;32m' red=$'\e[1;31m' blue=$'\e[1;34m' normal_colours=$'\e[m' PS1="\[$green\]\u@\[$blue\]\w\[$red\]$git_branch\[$green\]\\$\[$normal_colours\]" } PROMPT_COMMAND=myPS1