在 Shell 提示符中显示 Git 分支名称的方法_linux shell

Git 的好处之一就是把代码的分支管理变成了一件极其便捷的事情,分支只保留差异,不用复制任何文件,不用连接网络,快速创建,用完即删。Git 分支与项目的复杂程度无关,不管你的项目多么复杂,创建 Git 分支永远都是瞬间的事情。同时,因为保留了父类分支的信息,所以分支的合并也变得异常简单。

当在一个项目中频繁使用多个分支时,可以使用 git status 命令查询自己现在正工作在哪个分支下面,不过难免有脑子发昏的时候,忘记自己在哪个分支下面,因而发生误操作之类的杯具。

那么把分支显示在 Shell 提示符中无疑方便了很多,再也不需要频繁的使用 git status 命令了…

实现原理很简单,大体就是查询当前目录下面的 Git 分支名称,然后嵌入到 PS1 变量中。那么,Git 分支名称可以通过下面的脚本轻松的获得:

复制代码 代码如下:

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

把上面的脚本封装到函数中,修改 PS1 变量,嵌入函数… 大体是这样。但是这样也意味着一个问题,就是每次 shell 活动(比如切换目录,甚至只是敲下回车)都会执行一次 git … sed 命令,这样每次都启动2个进程,实在是有些不爽。

好在,可以使用另外一种方式来获取 Git 分支名称,在每个 Git 项目中,都有一个 .git 目录,这个目录下面有个叫做 HEAD 的文件,里面包含的当前分支的路径信息:

复制代码 代码如下:

ref: refs/heads/BRANCH-NAME

我们只要读取这个文件,然后再和对应的路径互相匹配一下就知道正确地分支名称了。不要只是简单的从 HEAD 内容中拆分出最后的 BRANCH-NAME,因为它不一定是正确地。

以下是 Aaron Crane 的实现方式:

复制代码 代码如下:

## Parses out the branch name from .git/HEAD:
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=" → (unknow)"
            fi
            return
        fi
        dir="../$dir"
    done
    git_branch=''
}

接下来,将这个函数加入到 PROMPT_COMMAND 中,保证 Bash 在创建 prompt 之前调用这个函数取得分支名称:

复制代码 代码如下:

PROMPT_COMMAND="find_git_branch; $PROMPT_COMMAND"

最后只要重新定义 PS1 变量即可:

复制代码 代码如下:

# Here is bash color codes you can use
  black=$'\[\e[1;30m\]'
    red=$'\[\e[1;31m\]'
  green=$'\[\e[1;32m\]'
 yellow=$'\[\e[1;33m\]'
   blue=$'\[\e[1;34m\]'
magenta=$'\[\e[1;35m\]'
   cyan=$'\[\e[1;36m\]'
  white=$'\[\e[1;37m\]'
 normal=$'\[\e[m\]'
 
PS1="$white[$magenta\u$white@$green\h$white:$cyan\w$yellow\$git_branch$white]\$ $normal"

以上的代码你可以放在 ~/.profile 或者 ~/.bash_profile 等文件中即可,我的系统是 Snow Leopard,PS1 定义在 /etc/bashrc 中,所以我直接修改的这个文件。

最终效果如下:

UPDATE – 2010/06/23:

如果你安装了随 Git 附送的 git-completion.sh 子命令自动完成脚本,也可以使用该脚本提供的方法:

复制代码 代码如下:

export PS1="[\u@\h \W"'$(__git_ps1 " (%s)")'"]\$ "

Ubuntu 系统,请参考: /etc/bash_completion.d/git

时间: 2024-12-23 10:45:54

在 Shell 提示符中显示 Git 分支名称的方法_linux shell的相关文章

Shell脚本中判断输入参数个数的方法_linux shell

$#代表了命令行的参数数量,可以看以下实例: 复制代码 代码如下: if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; fi 位置参数 $1, $2,..., $N,$#代表了命令行的参数数量, $0代表了脚本的名字 -ne    不等于 ----------------------- shell 编程中使用到得if语句内判断参数 –b 当

shell中的各种括号的使用方法_linux shell

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 现在分述如下: 1.Shell中变量的原形:${var}大家常见的变量形式都是$var

Shell脚本中使用function(函数)示例_linux shell

函数可以在shell script当中做一个类似自定义执行命令,最大的功能就是可以简化我们很多的程序代码.需要注意的是shell script的执行方式是由上而下/由左而右,因此在shellscript当中的function的设置一定要在程序的最前面,这样才能够在执行时被找到可用的程序段. 复制代码 代码如下: #!/bin/bash # Program #    This program is to show the use of "function" # History # 201

shell 随机从文件中抽取若干行的实现方法_linux shell

shuf -n5 main.txt sort -R main.txt | head -5 awk -vN=5 -vC="`wc -l file`" 'BEGIN{srand();while(n<N){i=int(rand()*C+1);if(!(i in a)){a[i]++;n++}}}NR in a' file while read line;do echo "$line $RANDOM";done < main.txt | sort -k2,2n|

Shell编程中的特殊变量之位置变量介绍_linux shell

1.$0 获得当前脚本的文件名,包括路径. 复制代码 代码如下: #写一个测试脚本 vim test.sh #内容如下 dirname$0 basename$0 #执行一下 bash$(pwd)/test.sh #输出如下 /home/jane test.sh 2.$n 获取当前执行脚本的第n个参数,n=1..9,$0,为当前脚本名.如果n大于9,使用${10} 复制代码 代码如下: echo'echo '$(seq-s " $"1 5|sed's/1/$1/') > test_

Linux下Shell脚本中几种基本命令的替换区别_linux shell

Part 1 : ` command ` 这是 "命令标准输出作为函数标准输入" 操作方法之一,有很大的弊端以及不安全的地方. 缺点一:比较陈旧. 缺点二:容易与单引号混淆.(其实它是你键盘"!"左边那个键) Part 1.5 ` command``与 $(command) 俩者区别 直接看几张图吧,看这图解释他们区别... 大家可以看到俩种表达方式,分别是代表命令直接执行和嵌套执行. 我们发现:执行`` 和 $() 是相同的. 附,其实这里有个小bug...( 橙

编写Bash Shell通过gnuplot绘制系统性能数据图的方法_linux shell

使用步骤: 1.设置一个定时任何 执行getperf.sh,采集性能数据 2.将采集到性能数据文件,如:192.168.1.1.tar.gz 解压 3.将性能分析的脚步performance_analyse.sh 放到解压后的目录中 4.安装gnuplot程序(这里下载) 5.将字体文件夹,拷贝到/usr/share/fonts/目录 6.直接运行 bash performance_analyse.sh getperf.sh脚本内容如下: ############################

Shell脚本监控服务器在线状态和邮件报警的方法_linux shell

对于服务器来说在线率很重要,出现问题要能及时解决,但系统管理员不能一直守在电脑旁边,通过脚本监控网站出现问题及时通过mail通知管理员,如果是139邮箱还可免费手机短信通知.注:通过系统直接发送mail容易被拦截,可使用mail连接第三方smtp发送邮件. shell脚本实现代码: 复制代码 代码如下: #!/bin/bash#set -xwhile truedo list=(www.jb51.net s.jb51.net) mail=jmj@jb51.net date=$(date -d "t

Shell脚本之无限循环的两种方法_linux shell

for 实现: 复制代码 代码如下: #!/bin/bash set i=0 set j=0 for((i=0;i<10;)) do         let "j=j+1"         echo "-------------j is $j -------------------" done while实现: 复制代码 代码如下: #!/bin/bash set j=2 while true do         let "j=j+1"