bash:优化git-aware shell提示符

时间:2016-09-23 18:09:35

标签: git bash shell

我已经编写了以下PS1,如果我在git repo中,它会将当前工作分支附加到shell提示符,否则不执行任何操作:

PS1='\[\e[00;32m\]\u@\h\[\e[0m\]\[\e[00;33m\] [\w]$(branch=`git symbolic-ref --short -q HEAD 2> /dev/null || git rev-parse -q --short HEAD 2> /dev/null` ; if [ $branch ] ; then echo -n -e " \e[95m<$branch>" ; fi) \[\e[00;33m\]\$\[\e[0m\] '

问题在于这会减慢提示速度,以至于如果我尝试快速跳过几行,我通常都不会得到提示。

我想知道这是否可以优化以更快地运行。我唯一能想到的就是在git branch周围创建一个包装器,将新工作分支打印到/repo/.git/中的文件中。然后我可以简单地在PS1命令中调用cat /repo/.git/.prompt或其他东西。我不确定这实际上会跑得更快,因为我需要一些逻辑来确定文件树中某处是否有.git目录,这会有它自己的问题。

我还是不喜欢这个解决方案,所以我想知道是否有更快的方法从git repo中获取当前的分支名称。

注意:我清楚git-aware-prompt之类的内容,但我遇到了同样的问题。我也可以使用$PROMPT_COMMAND,它运行得更快,但它也只能在提示开头打印分支名称,这不是我喜欢的。

1 个答案:

答案 0 :(得分:2)

PROMPT_COMMAND的一个主要好处是它允许您在每次显示时动态建立提示。

build_prompt () {
  PS1='\[\e[00;32m\]\u@\h\[\e[0m\]\[\e[00;33m\] [\w]'
  branch=$(git symbolic-ref --short -q HEAD 2> /dev/null ||
           git rev-parse -q --short HEAD 2> /dev/null)
  [[ $branch ]] &&  PS1+=" \e[95m<$branch>" 
  PS1+=' \[\e[00;33m\]\$\[\e[0m\] '
}

PROMPT_COMMAND=build_prompt