在 Windows 的 Git Bash 中,进入 Git 仓库目录后,终端通常会直接显示当前所在分支,例如:
dev@server MINGW64 /path/to/project (main)
但在 Linux 服务器上,默认提示符一般只显示用户名、主机名和路径:
dev@server:/path/to/project$
对于经常在多个项目、多个分支之间切换的开发者来说,看不到当前 Git 分支很容易误操作。本文记录一种 Linux 下的全局配置方式,让所有 bash 用户都能在终端提示符里看到当前 Git 分支。
进入普通目录时:
dev@server /path/to$
进入 Git 仓库时:
dev@server /path/to/project (main)$
其中:
~/.bashrc如果只修改当前用户的:
~/.bashrc
那么配置只对当前用户生效。
如果希望所有用户都生效,应该优先考虑系统级 bash 配置文件:
/etc/bash.bashrc
在 Debian、Ubuntu 等系统中,/etc/bash.bashrc 会被交互式 bash shell 加载,因此适合放全局配置。
.bashrc 覆盖很多系统默认的加载顺序可能类似:
/etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
也就是说,即使我们在 /etc/bash.bashrc 里设置了 PS1,后面的用户级 ~/.bashrc 仍然可能重新设置 PS1,导致全局配置失效。
例如 Ubuntu 默认的 ~/.bashrc 中通常会有类似代码:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
这会覆盖我们在 /etc/bash.bashrc 中提前设置的提示符。
因此,更稳妥的方式不是简单地 export PS1=...,而是使用 PROMPT_COMMAND。
编辑系统级 bash 配置文件:
sudo vim /etc/bash.bashrc
在文件末尾添加:
__global_set_git_prompt() {
local branch
branch=$(git branch --show-current 2>/dev/null)
if [ -n "$branch" ]; then
PS1='\[\033[36m\]\u@\h\[\033[00m\] \[\033[33m\]\w\[\033[00m\] \[\033[32m\]('"$branch"')\[\033[00m\]\$ '
else
PS1='\[\033[36m\]\u@\h\[\033[00m\] \[\033[33m\]\w\[\033[00m\]\$ '
fi
}
PROMPT_COMMAND="__global_set_git_prompt${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
保存后,当前终端如果想立即生效,可以执行:
source /etc/bash.bashrc
之后重新打开终端或重新 SSH 登录时,会自动生效,不需要每次手动 source。
branch=$(git branch --show-current 2>/dev/null)
这行用于获取当前目录所在 Git 仓库的分支名称。
例如在 main 分支下,返回:
main
如果当前目录不是 Git 仓库,则不会返回内容。
2>/dev/null 的作用是隐藏错误输出,否则在非 Git 目录下可能会看到错误信息。
if [ -n "$branch" ]; then
-n 表示字符串非空。
如果 branch 有值,说明当前目录在 Git 仓库中,于是提示符中显示分支:
(main)
如果 branch 为空,则说明当前目录不是 Git 仓库,只显示普通提示符。
PS1='\[\033[36m\]\u@\h\[\033[00m\] \[\033[33m\]\w\[\033[00m\] \[\033[32m\]('"$branch"')\[\033[00m\]\$ '
其中:
| 片段 | 含义 |
|---|---|
\u |
当前用户名 |
\h |
当前主机名 |
\w |
当前完整路径 |
\$ |
普通用户显示 $,root 用户显示 # |
\033[36m |
青色 |
\033[33m |
黄色 |
\033[32m |
绿色 |
\033[00m |
重置颜色 |
最终效果类似:
dev@server /path/to/project (main)$
\[ 和 \]在 PS1 中,颜色控制字符本身不会占用终端显示宽度。
因此需要使用:
\[
\]
告诉 bash:这一段是不可见控制字符,不要把它算进提示符长度。
否则在命令过长、换行、删除字符时,可能出现光标位置错乱。
正确写法:
\[\033[32m\]
不推荐写法:
\033[32m
有些写法会定义一个函数,例如:
__global_git_branch() {
branch=$(git branch --show-current 2>/dev/null)
if [ -n "$branch" ]; then
printf " \033[32m(%s)\033[00m" "$branch"
fi
}
然后在 PS1 中调用:
PS1='...\$(__global_git_branch)\$ '
这种方式在某些场景下可以工作,但如果系统或用户自己的 .bashrc 后续又重新设置了 PS1,它仍然会被覆盖。
所以本文推荐直接使用 PROMPT_COMMAND,每次显示提示符之前都重新生成一次 PS1,稳定性更好。
可以进入一个 Git 仓库目录:
cd /path/to/project
如果提示符显示类似:
dev@server /path/to/project (main)$
说明配置已经生效。
也可以开一个新的 login shell 测试:
bash -l
再进入 Git 仓库查看提示符。
本文配置的是 bash。
可以通过下面命令查看当前 shell:
echo $SHELL
如果输出是:
/bin/bash
说明当前用户默认使用 bash。
如果使用的是 zsh,则需要改 zsh 的配置,例如:
/etc/zsh/zshrc
或用户级:
~/.zshrc
修改 /etc/bash.bashrc 后,已经打开的终端不会自动更新。
当前终端想立刻生效,需要执行:
source /etc/bash.bashrc
但这只是为了刷新当前会话。
新开的终端或新的 SSH 登录会自动加载配置,不需要每次手动执行。
.bashrc 强行覆盖 PROMPT_COMMAND如果某些用户的 ~/.bashrc 后面又重新设置了 PROMPT_COMMAND,也可能覆盖全局配置。
这种情况下可以检查:
grep -n "PROMPT_COMMAND\|PS1" ~/.bashrc
如果存在覆盖逻辑,需要按实际情况调整用户级配置。
Linux 下想全局显示 Git 当前分支,不建议只在 /etc/bash.bashrc 中简单设置 PS1,因为用户自己的 .bashrc 可能会再次覆盖提示符。
更稳妥的方式是:
PROMPT_COMMAND="__global_set_git_prompt${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
让 bash 在每次显示提示符之前动态生成 PS1。
这样无论当前目录是不是 Git 仓库,都能得到清晰、直观的终端提示符:
dev@server /path/to/project (main)$
对于经常在服务器上开发、部署、切换分支的人来说,这个小配置非常实用。
优先推荐相关内容,同时保留你的阅读轨迹和收藏入口。
暂无阅读历史
收藏后会出现在这里