git分支状态需加载git-prompt.sh并正确配置环境变量才能显示脏状态;须先source脚本、再设git_ps1_showdirtystate等变量、最后定义ps1;符号颜色定制依赖主题文件,性能问题可通过超时或简化检测解决。

Git 分支状态能自动显示在 Bash 提示符里,但默认不开启;关键不是改 PS1 字符串本身,而是得让 Git 的状态解析函数被正确加载并调用,否则只显示分支名、不显示脏状态(比如 * 或 ✚)是常见失败点。
git-prompt.sh 必须先 source,否则 __git_ps1 不可用
很多用户把 __git_ps1 直接写进 PS1 却报错或无输出,根本原因是没加载 Git 自带的提示函数脚本。这个脚本不在系统路径里,得手动下载并引入:
- 从 Git 源码仓库复制
contrib/completion/git-prompt.sh到本地(例如~/git-prompt.sh) - 在
~/.bashrc中添加一行:. ~/git-prompt.sh - 必须放在
PS1=...赋值语句之前,否则 shell 解析时找不到__git_ps1 - 注意:不要用
source替代.,某些旧版 bash 不识别source内建命令
__git_ps1 的参数控制状态符号是否显示
__git_ps1 默认只输出分支名,要让它带上修改/暂存等状态,得设置环境变量,而不是改函数调用方式:
-
export GIT_PS1_SHOWDIRTYSTATE=1→ 显示*(工作区有修改)和+(暂存区有变更) -
export GIT_PS1_SHOWSTASHED=1→ 显示$(存在 stash) -
export GIT_PS1_SHOWUNTRACKEDFILES=1→ 显示%(存在未跟踪文件) - 这些变量必须在
. ~/git-prompt.sh之后、PS1=...之前设置,顺序错就无效
示例有效配置段:
. ~/git-prompt.sh export GIT_PS1_SHOWDIRTYSTATE=1 export GIT_PS1_SHOWSTASHED=1 export PS1='\u@\h:\w$(__git_ps1 " (%s)")\$ '
自定义符号和颜色得改主题文件,不能硬编码进 PS1
想把 ● 换成 ★、把分支名改成红色,不能靠改 PS1 里的字符串——那些符号由 git-prompt.sh 内部变量控制,而这些变量又由主题文件(如 ~/.git-prompt-colors.sh)定义:
- 运行
./gitprompt.sh make_custom_theme(需先克隆bash-git-prompt项目)生成初始主题 - 或直接复制
themes/Custom.bgptemplate为~/.git-prompt-colors.sh - 编辑该文件,修改类似
GIT_PROMPT_STAGED="${Red}★"或GIT_PROMPT_BRANCH="${BoldRed}" - 再在
~/.bashrc中. ~/.git-prompt-colors.sh,且必须在. ~/git-prompt.sh之后
漏掉主题文件加载,或加载顺序颠倒,所有颜色/符号定制都会失效。
非 Git 仓库目录下提示符变慢?检查 git status 超时逻辑
如果进入大目录(比如含数万文件的 node_modules)时提示符明显卡顿,问题大概率出在 __git_ps1 默认会执行 git status 检查状态。它没有超时机制,会卡住整个 shell 渲染:
- 加一行
export GIT_PS1_SHOWUPSTREAM="auto"可略微缓解,但治标不治本 - 真正解决要靠 patch:在
git-prompt.sh里找到__git_ps1函数中调用git status的地方,套上timeout 0.5(需系统装了coreutils) - 更稳妥的做法是换用轻量方案,比如用
git rev-parse --abbrev-ref HEAD 2>/dev/null只取分支名,放弃实时脏状态检测
复杂提示符的代价是性能,尤其在老旧机器或网络文件系统上,这点容易被忽略——直到你 cd 进一个目录要等两秒才看到 $。











