我已经编写了以下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
,它运行得更快,但它也只能在提示开头打印分支名称,这不是我喜欢的。
答案 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