zoukankan      html  css  js  c++  java
  • 如何在终端实时展现git分支

    在微博上看到ghosTM55在终端可以实时展现出当前运行的分支,觉得很奇特,于是google了一把。这里面存在两个内容,第一个bash,第二个是git

    bash基础:

    了解到linux的shell存在PS1, PS2,PS3, PS4,这些都作为环境变量存在。

    PS1表示的默认交互提示,在ubuntu-12.04中的默认值是 "[e]0;u@h: wa]${debian_chroot:+($debian_chroot)}u@h:w$",也就是我们通常可以看到的:

      damon@damon:~/pyenv/bin$ 

    在PS1中

    u -- 表示用户名

    h -- 表示主机名

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

    s -- 表示的bash

    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的进程,开销会有些大。

    二、先定义一个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中的颜色知道当前的状态。


    这儿有一份相关的说明:

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

    这儿有另一份中文说明:

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

  • 相关阅读:
    mybatis中的缓存
    mybatis中的延迟加载
    mybatis中的ResultMap关联映射
    mubatis中为什么实体类要继承Serializable
    【经验总结-markdown】markdown字体和颜色设置
    【算法】动态规划
    【刷题-PAT】A1135 Is It A Red-Black Tree (30 分)
    【刷题-PAT】A1126 Eulerian Path (25 分)
    【刷题-PAT】A1119 Pre- and Post-order Traversals (30 分)
    【刷题-PAT】A1114 Family Property (25 分)
  • 原文地址:https://www.cnblogs.com/ubunoon/p/3188726.html
Copyright © 2011-2022 走看看