You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Bash自定义PS1实时显示Git状态并在目录/文件变更后自动刷新?

解决PS1 Git信息自动刷新问题

你的问题根源在于:当前PS1中的Git信息是bash启动时一次性计算并固化的,$(prompt_git)仅执行一次,后续目录切换、Git操作或文件变更都不会重新调用该函数,导致信息无法更新。

核心修改方案

将PS1中调用prompt_git的方式改为动态执行,让bash每次渲染提示符时都重新计算Git状态。只需把$(prompt_git)改为\$(prompt_git)(转义$符号)即可。

修改后的完整代码

tput sgr0;
reset=$(tput sgr0);
white=$(tput setaf 15);
violet=$(tput setaf 61);
green=$(tput setaf 64);
purple=$(tput setaf 125);
yellow=$(tput setaf 136);

prompt_git() {
    local s='';
    local branchName='';

    # Check if the current directory is in a Git repository.
    git rev-parse --is-inside-work-tree &>/dev/null || return;

    # Check for what branch we’re on.
    branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \
        git describe --all --exact-match HEAD 2> /dev/null || \
        git rev-parse --short HEAD 2> /dev/null || \
        echo '(unknown)')";

    # Check for uncommitted changes in the index.
    if ! $(git diff --quiet --ignore-submodules --cached); then
        s+='+';
    # Check for unstaged changes.
    elif ! $(git diff-files --quiet --ignore-submodules --); then
        s+='!';
    # Check for untracked files.
    elif [ -n "$(git ls-files --others --exclude-standard)" ]; then
        s+='?';
    # Check for stashed files.
    elif $(git rev-parse --verify refs/stash &>/dev/null); then
        s+='$';
    else
        s+='-';
    fi;

    echo "\[${white}\] on \[${violet}\]${branchName} \[${purple}\][${s}]";
}

PS1="\[\033]0;\W\007\]";
PS1+="\[${green}\]\w";

# 关键改动:用\$(prompt_git)替代$(prompt_git),实现动态执行
PS1+="\$(prompt_git)";

PS1+="\[${white}\]: $ \[${reset}\]";
export PS1;

PS2="\[${yellow}\]→ \[${reset}\]";
export PS2;

生效方式

修改后执行source ~/.bashrc,即可让新配置生效。此时:

  • 切换到Git目录时,提示符会自动加载分支和状态
  • 修改文件、执行Git操作后,提示符会自动更新状态

内容的提问来源于stack exchange,提问作者Gustavo Fenilli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:07:22