如何在linux终端实时展现当前git分支

电脑知识 投稿 50700 0 评论

如何在linux终端实时展现当前git分支

如何在终端实时的展示当前所处的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.feishuai.vip$ 

在PS1中

\u -- 表示用户名

\h -- 表示主机名

\w -- 当前目录的全局路径,如果是home目录,显示~

\s -- 表示的bash

\v -- 表示版本

所以你可以修改默认的提示符:

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

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

yhm@yhm-pc-4.2 ~/www.feishuai.vip

通常情况下,我们只会用到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.feishuai.vip$

注意时间是定格的

可以使用unset方法来取消 PROMPT_COMMAND

git基础

git是存在分支的,当前所在的git分支可以通过git branch来察看。

另外一种方式,获取.git/HEAD文件中的内容,格式是:

ref: refs/heads/当前分支名称

于是实现在终端实时展现git分支就有两种方案:

一、用下面指令替换PS1

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

但是存在问题,那就是每次shell活动,都要启动一个git和sed的进程,开销会有些大。

二、先定义一个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

green=$'\e[1;32m'#绿色
magenta=$'\e[1;35m'#紫色
normal_colours=$'\e[m'

PS1="\[$green\]\u@\h:\w\[$magenta\]$git_branch\[$green\]\\$\[$normal_colours\] "

这样就可以在PS1中的颜色知道当前的状态。

关于上面的颜色代码可参考:PHP在终端输出带颜色的字体

备注:以上修改都是在 ~/.bashrc 文件中进行的操作。

编程笔记 » 如何在linux终端实时展现当前git分支

赞同 (233) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽