您的位置:首页 > 运维架构 > Shell

cshell命令行显示当前git branch名字

2017-06-16 10:44 190 查看
Git可以创建很多的branch,而且可以很方便的在branch之间进行切换。

那么如何快速的知道我们现在处在哪个branch上面呢?

最简单的方法:

      执行 #git branch

此时,当前所有的git branch都将列举出来,并且当前branch名字前面会有 “*",而且当前branch名字颜色也会不一样;

  
本文介绍另一种方法,可以直接在命令行中显示当前branch name,效果图如下:

上图中shell命令行共显示3个内容,具体如下:

* XALOGIN2  : 表示hostname

* it/l1/if1_prach_scripts :表示当前目录

* env :表示当前branch的名字

实现方法如下:

1:在.cshrc中定义颜色(要显示的内容,可以按已定义的颜色进行显示);

同时定义变量git_branch_name(初始化为null)存储当前branch name

2:设置shell命令行要显示的内容,及所采用的颜色

set git_branch_name="null"
set normal="%{\e[m%}"
set black="%{\e[0;30m%}"
set red="%{\e[0;31m%}"
set green="%{\e[0;32m%}"
set yellow="%{\e[0;33m%}"
set blue="%{\e[0;34m%}"
set magenta="%\e[0;35m%}"
set cyan="%{\e[0;36m%}"
set white="%{\e[0;37m%}"


其中:

* `hostname  :显示主机名

* %c4
:显示当前路径(其中4表示,只显示当前路径之前的4层路径;如果想多显示,可以自己进行更改)

* $git_branch_name:为自己定义的一个变量,该变量用来存储当前git branch 的名字

需要注意的是:上面只是定义了要显示的内容和格式,为了正确显示git branch名字,就需要实时的更新git_branch_name变量及shell命令行的显示;

1:如何实时更新git_branch_name变量

在.git目录中,有一个HEAD文件,用于保存当前branch的名字,这里的方法,就是循环的去查找父目录,如果找到HEAD,就读出当前branch名字赋值给git_branch_name,如果没找到,就赋值为null;

set dir=$cwd
set git_branch_name="null"

while("$dir" != "/")
if (-f "$dir/.git/HEAD") then
set head=`cat $dir/.git/HEAD`
if ("$head" != "ref:\ refs/heads/*") then
set git_branch_name=`echo "$head" | sed -e "s#.*heads/##"`
else if ($head != '') then
set git_branch_name="(detached)"
else
set git_branch_name="(unknown)"
endif
break
endif
set dir=`dirname $dir`
end


这里由于cshell不支持function,因此这一个功能单独放在一个文件(.update_git_branch_name)中,然后在.cshrc中source该文件。(之前试过将该文件内容直接写入.cshrc,发现可以正常显示,但有一些别的问题,就单独放在文件中了,如果大家有好的方法,就可以不用再多这个文件)

在写这个文件时,刚开始一直有问题,不知道如何拿到父目录,最终导致while死循环,最后发现dirname可以用;其实算法很简单,由于shell不太会,也是从网上找的代码,改了改bug。
2:何时需要更新shell命令行的显示

因为在进行目录切换时,有可能切换到一个git中,因此在进行目录切换时,需要更新命令行的显示;

此外,在git checkout进行branch切换时,也需要更新命令行的显示;

具体更新方法是,通过alias,更改cd及git checkout命令,在每次执行cd及git checkout时,都刷新一下命令行的显示,具体如下:

set prompt="$cyan`hostname`:$green~%c4$magenta@$yellow$git_branch_name$normal >"
alias setprompt `set prompt="$cyan`hostname`:$green~%c4$magenta@$yellow$git_branch_name$normal >"'
alias update_git_branch_name 'source ./.update_git_branch_name'
alias cd 'chdir \!* && update_git_branch_name && setprompt'
alias gc 'git checkout \!* && update_git_branch_name && setprompt'


这里需要注意,git checkout需要替换成gc。由于没有找到方法直接替换git checkout,因此,这里只能使用gc来替换(好像alias中,命令不能有空格,所以只能用gc了;如果使用git checkout,那么shell命令行中,branch名字是不会更新的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息