[工具]配置命令行以支持git显示

命令行配置相关信息,以便更友好的支持git相关命令的显示;

PS1

Bash,[Unix shell](https://baike.baidu.com/item/Unix shell)的一种,是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令;还能从脚本文件中读取命令并执行。

Bash有四个可以自定义的提示符变量

PS1 交互式脚本等待用户输入时的提示信息
PS2 一条命令没有结束的时候的连接性的提示(比如使用\将一行复杂的命令使用多行连接起来的场合),默认是'> '符号
PS3 和select命令结合使用,使用较少
PS4 调试时的行前显示内容,使用较少

通过调整PS1变量,可以配置相关的提示信息

转义字符

输出提示符时,Bash 会查找一些反斜杠开头的字符,然后转义成特殊字符。

\d 日期,格式为weekday month date,例如:"Mon Aug 1"
\H 完整的主机名称
\h 包含.的情况下取第一个字段
\t 显示时间为24小时格式,如:HH:MM:SS
\T 显示时间为12小时格式
\A 显示时间为24小时格式:HH:MM
\u #当前用户的账号名称
\v BASH的版本信息
\w 完整的工作目录名称
\W 利用basename取得工作目录名称,所以只会列出最后一个目录
$ 提示字符,如果是root时,提示符为:# ,普通用户则为:$
\nnn 使用八进制表示的ASCII,比如\a也可以表现为\007
\e 转义(033)(比如进行颜色设定)
! 当前命令在历史命令缓冲区中的序号
# 命令编号, 从1开始(!是在history的位置)

还有其他一些使用较少的转义字符,就不一一列出了

颜色

在PS1中设置字符颜色的格式为:\[\e[I;F;Bm\]........\[\e[0m\]

  • F为字体颜色,编号为30-37

  • B为背景颜色,编号为40-47

  • I为特殊效果,(这个字母代号是我自己随便写的,没找到官方对应的字母代号)

  • \[\e[0m\]表示颜色设定的结束(\e等价于\033)

  • F,B,I三个设置信息没有顺序要求,可以随便写

具体颜色值含义如下

字体颜色编号 背景颜色编号 颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫色
36 46 青色
37 47 白色

除了能设置颜色,还可以设置一些特殊的展示效果,具体如下:

效果编号 效果
0 OFF
1 高亮显示
4 underline
5 闪烁
7 反白显示
8 不可见

自己的配置如下:

export PS1='\[\e[1;35m\][\u@xiaoshuai:\[\e[36m\]/\W \[\e[1;35m\]\t]\$\[\e[0m\]'

~/.bash_profile文件中写入上述命令,并执行 source ~/.bash_profile 即可生效

Mac OSX 是 ~/.bash_profile文件,对应到Linux的话就是 ~/.bashrc 文件

Git支持

如果在命令行执行git命令,良好的提示信息也能提供很大的便利,列举以下几个自己使用的设置:

显示分支名

有几个点需要先声明以下

  • 要显示分支名的话,需要调整PS1环境变量
  • 设置PS1的~/.bash_profile 文件可以看做是一个shell脚本,不过不是用户执行的,可以在里面执行一些shell命令
  • 展示分支名的思路,就是在~/.bash_profile 文件中编写函数,获取git项目的分支名,然后写到PS1环境变量中

获取git项目的分支名有多种方式,我这里只是列举两种,

git rev-parse --abbrev-ref HEAD
git symbolic-ref --short HEAD

然后修改~/.bash_profile文件如下:

#获取分支名并输出
function git_branch {
  branch="`git rev-parse --abbrev-ref HEAD 2>/dev/null`"
  if [ "${branch}" != "" ];then
    echo "($branch)"
  fi
}

#把分支名添加到PS1中
export PS1='\[\e[1;35m\][\u@xiaoshuai:\[\e[36m\]/\W\[\e[32m\]$(git_branch) \[\e[1;35m\]\t]\$\[\e[0m\]'

获取git分支名有多种方法,自行挑选一种实现即可,原理都是一样的。

分支的状态和颜色

目标是根据git分支不同的状态,来分别展示不同的颜色。
大概的思路,就是获取当前分支的状态,然后判断当前状态应该展示哪种颜色,输出到PS1变量中
git分支状态

通过git status 命令可以获取当前分支的状态,一个常见的输出示例如下:

On branch release
Your branch is up to date with 'origin/release'.

nothing to commit, working tree clean

对于某个固定状态,最后一行文本的输出是固定的,所以只需要关注最后一行输出即可。找到所有可能的输出,针对每个输出都设置对应的颜色,就能实现预期的功能。

#Git branch status
function git_status {
  local unknown untracked stash clean ahead behind staged dirty diverged
  unknown='1;36' # cyan
  untracked='1;31' # red
  stash='1;32' # green
  clean='1;32' # green
  ahead='1;33' # yellow
  behind='1;33' # yellow
  staged='1;34' # blue
  dirty='1;31' # red
  diverged='1;31' # red

  branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
  if [[ -n "$branch" ]]; then
    if [[ "$branch" == 'HEAD' ]]; then
      branch=$(git rev-parse --short HEAD 2>/dev/null)
    fi
    git_status=$(git status 2> /dev/null)
    # If nothing changes the color, we can spot unhandled cases.
    color=$unknown
    if [[ $git_status =~ 'Untracked files' ]]; then
      color=$untracked
      branch="${branch}+"
    fi
    if git stash show &>/dev/null; then
      color=$stash
      branch="${branch}*"
    fi
    if [[ $git_status =~ 'working directory clean' ]]; then
      color=$clean
    fi
    if [[ $git_status =~ 'Your branch is ahead' ]]; then
      color=$ahead
      branch="${branch}"
    fi
    if [[ $git_status =~ 'Your branch is behind' ]]; then
      color=$behind
      branch="${branch}"
    fi
    if [[ $git_status =~ 'Changes to be committed' ]]; then
      color=$staged
    fi
    if [[ $git_status =~ 'Changed but not updated' ||
          $git_status =~ 'Changes not staged'      ||
          $git_status =~ 'Unmerged paths' ]]; then
      color=$dirty
    fi
    if [[ $git_status =~ 'Your branch'.+diverged ]]; then
      color=$diverged
      branch="${branch}!"
    fi
    printf "\e[%sm%s" "$color" "($branch)"
  fi
  return 0
}

export PS1='\[\e[1;35m\][\u@xiaoshuai:\[\e[36m\]/\W$(git_status) \[\e[1;35m\]\t]\$\[\e[0m\]'

脚本逻辑比较简单,可以根据个人喜好,调整各种状态的颜色。

自动补全分支名

自动补全分支名这个功能,就依赖git官方的一个脚本了,也是网上能找到的通用方法

#1. 获取官方脚本
git clone https://github.com/git/git.git 或者 git clone git@github.com:git/git.git

contrib/completion/git-completion.bash 自动补全脚本

#2. 把该脚本专门存储一下
cp git-completion.bash ~/.git-completion.bash

#3. 修改 ~/.bash_profile 文件,添加下面一行
source ~/.git-completion.bash

如果不想clone整个项目,也可以直接copy对应脚本的内容,粘贴到本地,https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash

这个脚本内容很多,有3000多行,感兴趣的话可以自行研究一下,通过最前面的注释,可以了解到,这个脚本支持这些信息的自动补齐

  • branch 名字
  • tag 名字
  • file 名字
  • Git 的子命令
  • emain 信息
  • tree paths
  • file paths
  • common --long-options
    这些支持也足够平时的使用了

官方脚本中的 contrib/completion/git-prompt.sh 文件,支持高亮显示当前分支名称,
本地存储该文件 cp git-prompt.sh ~/.git-prompt.sh
修改 ~/.bash_profile 文件,添加下面这些内容

# git显示分支官方实现
GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWCOLORHINTS=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
#GIT_PS1_SHOWUPSTREAM=auto           
if [ -f ~/.git-completion.bash ]; then
  source ~/.git-prompt.sh
  PROMPT_COMMAND='__git_ps1 "[\t][\u@\h:\w]" "\\\$ "'
fi
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容