Git Bash 提示符简化
1、背景
在 Git Bash 启动后,命令输入前显示的这一段专业上通常叫 Shell prompt,在 Bash 环境中也可以叫 Bash prompt 或"命令提示符"。默认提示符通常类似下面这样:
bash
Alice@DESKTOP-ABC123 MINGW64 /xxx/xxx/xxx
$
其中:
Alice是当前用户名。DESKTOP-ABC123是主机名。MINGW64表示当前 Git Bash / MinGW 环境。/xxx/xxx/xxx是当前所在路径。- 如果当前目录是 Git 仓库,默认提示符还会在路径后显示当前 Git 分支,例如
(main)。- 比如:
Alice@DESKTOP-ABC123 MINGW64 /xxx/xxx/xxx (main)
- 比如:
需求是简化提示符,去掉较长且日常使用价值不高的 主机名 和 MINGW64,保留更关心的信息:
bash
Alice /xxx/xxx/xxx
$
最终目标是在 Git 仓库目录下同时保留当前分支显示:
bash
Alice /xxx/xxx/xxx (main)
$
非 Git 仓库目录下则保持为:
bash
Alice /xxx/xxx/xxx
$
2、解决方案
最终是在用户目录下的 Git Bash 启动配置文件中追加自定义 PS1 配置:
bash
# Custom Git Bash prompt: user path + Git branch
if ! type __git_ps1 >/dev/null 2>&1; then
test -f /etc/profile.d/git-prompt.sh && . /etc/profile.d/git-prompt.sh
fi
if type __git_ps1 >/dev/null 2>&1; then
PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]\[\033[32m\]\u \[\033[33m\]\w\[\033[36m\]$(__git_ps1 " (%s)")\[\033[0m\]
$ '
else
PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]\[\033[32m\]\u \[\033[33m\]\w\[\033[0m\]
$ '
fi
该配置写入的位置是:
text
C:\Users\Alice\.bashrc
同时确认了:
bash
C:\Users\Alice\.bash_profile
会加载 .bashrc:
bash
test -f ~/.profile && . ~/.profile
test -f ~/.bashrc && . ~/.bashrc
因此重新打开 Git Bash,或者在已打开的 Git Bash 中执行下面命令即可生效:
bash
source ~/.bashrc
3、分析
3.1 为什么修改 .bashrc
Git Bash 启动时会读取用户目录下的启动配置文件。当前机器上的 .bash_profile 已经包含:
bash
test -f ~/.bashrc && . ~/.bashrc
这表示如果 ~/.bashrc 存在,就加载它。因此把提示符配置写在 .bashrc 中,可以在每次打开 Git Bash 时自动生效。
3.2 PS1 是什么
PS1 是 Bash 的主提示符变量,其中 PS 可以理解为 prompt string。终端里每次等待输入命令时,前面显示的 Shell prompt / Bash prompt 内容就是由 PS1 控制的。
例如:
bash
PS1='\u \w
$ '
大致表示:
\u:显示当前用户名,例如Alice。\w:显示当前路径。- 换行后显示
$,作为输入命令的位置。
3.3 为什么要显式处理 Git 分支
Git Bash 提示符中的分支信息不是 Bash 自动提供的,而是依赖 Git 提供的辅助函数 __git_ps1。因此自定义 PS1 时,如果希望继续显示当前 Git 分支,就需要在提示符中显式调用这个函数。
3.4 __git_ps1 的作用
__git_ps1 是 Git prompt 脚本提供的函数,用来在当前目录是 Git 仓库时输出分支信息。
配置中使用了:
bash
$(__git_ps1 " (%s)")
含义是:
- 如果当前目录是 Git 仓库,则输出当前分支。
" (%s)"是输出格式,%s会被替换为分支名。- 当前分支为
main时,输出结果是(main)。 - 前面的空格用于让路径和分支之间有间隔。
所以最终效果类似:
bash
Alice ~/project (main)
$
3.5 为什么要先检查 __git_ps1
配置中有两次检查:
bash
if ! type __git_ps1 >/dev/null 2>&1; then
test -f /etc/profile.d/git-prompt.sh && . /etc/profile.d/git-prompt.sh
fi
第一段表示:如果当前 Shell 还没有 __git_ps1 函数,就尝试加载 Git Bash 自带的 prompt 脚本:
bash
/etc/profile.d/git-prompt.sh
随后再次检查:
bash
if type __git_ps1 >/dev/null 2>&1; then
这是为了确认加载是否成功。
如果 __git_ps1 可用,就使用带 Git 分支的提示符;如果不可用,就退回到只显示用户名和路径的提示符。这样即使某些环境下 Git prompt 脚本不存在,Git Bash 也不会报错。
3.6 颜色和终端标题控制
配置中的这些内容用于颜色和终端标题:
bash
\[\033]0;$TITLEPREFIX:$PWD\007\]
\[\033[32m\]
\[\033[33m\]
\[\033[36m\]
\[\033[0m\]
含义大致是:
\[\033]0;$TITLEPREFIX:$PWD\007\]:保留 Git Bash 原有的窗口标题更新行为。\[\033[32m\]:后续文本显示为绿色。\[\033[33m\]:后续文本显示为黄色。\[\033[36m\]:后续文本显示为青色。\[\033[0m\]:重置颜色,避免输入的命令继续继承提示符颜色。
外层的 \[ 和 \] 用于告诉 Bash:这些是不可见的控制字符,不应该计入提示符宽度。这样可以避免光标位置、换行、退格等行为出错。
4、参考
本次操作主要参考了当前机器上的实际配置和 Git Bash 自带行为:
C:\Users\Alice\.bashrc:最终写入自定义提示符配置的位置。C:\Users\Alice\.bash_profile:确认 Git Bash 启动时会加载.bashrc。/etc/profile.d/git-prompt.sh:Git Bash 中提供__git_ps1函数的 prompt 脚本。Git Bash 的 bash.exe 路径:本机实际使用的 Git Bash 可执行文件路径,用于验证配置加载。