preface
添加到.bashrc末尾
bash
# ==================== Git 增强提示符 ==================== yan add may18
git_prompt() {
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
return
fi
local git_root
git_root=$(git rev-parse --show-toplevel 2>/dev/null)
# 如果 HOME 本身是 git 仓库,则不显示,避免到处都有提示
if [ "$git_root" = "$HOME" ]; then
return
fi
local branch
branch=$(git branch --show-current 2>/dev/null)
if [ -z "$branch" ]; then
branch="detached"
fi
local ahead=0
local behind=0
# 如果当前分支设置了 upstream,比如 origin/main
if git rev-parse --abbrev-ref --symbolic-full-name @{u} >/dev/null 2>&1; then
ahead=$(git rev-list --count @{u}..HEAD 2>/dev/null || echo 0)
behind=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo 0)
fi
local dirty
dirty=$(git status --porcelain 2>/dev/null | wc -l)
local cyan=$'\001\033[1;36m\002'
local red=$'\001\033[31m\002'
local yellow=$'\001\033[33m\002'
local reset=$'\001\033[0m\002'
local info="(${cyan}${branch}${reset}"
if [ "$dirty" -gt 0 ]; then
info+=" ${red}⚡${reset}"
fi
if [ "$ahead" -gt 0 ]; then
info+=" ${yellow}↑${ahead}${reset}"
fi
if [ "$behind" -gt 0 ]; then
info+=" ${red}↓${behind}${reset}"
fi
info+=")"
printf " %s" "$info"
}
PS1='\u@\h:\w$(git_prompt) \$ '
一、解释脚本
1. ahead / behind 判断本地和远程repo版本
bash
ahead=$(git rev-list --count HEAD..origin/"$branch" 2>/dev/null || echo 0)
behind=$(git rev-list --count origin/"$branch"..HEAD 2>/dev/null || echo 0)
含义是:
bash
HEAD..origin/branch # 远程有、本地没有 => 本地落后 behind
origin/branch..HEAD # 本地有、远程没有 => 本地超前 ahead
2. 颜色代码
在 Bash 里,用:
bash
$'\033[1;36m'
或者:
bash
$'\e[1;36m'
可以显示颜色,更直观
二、更新.bashrc
然后执行:
bash
source ~/.bashrc
显示效果大概是
如果你在 main 分支,本地比远程多 2 个提交:
bash
ubuntu@:~/(main ↑2) $
如果本地落后远程 3 个提交:
bash
ubuntu@:~/(main ↓3) $
如果有未提交修改:
bash
ubuntu@:~/(main ⚡) $
如果既有修改,又超前又落后:
bash
ubuntu@:~/(main ⚡ ↑1 ↓2) $
额外检查一下 upstream
如果你发现一直不显示 ↑ 或 ↓,可能是当前分支没有绑定远程分支。
进入项目目录后执行:
bash
git branch -vv
如果看不到类似:
bash
main abc1234 [origin/main] commit message
那就绑定一下:
bash
git branch --set-upstream-to=origin/main main
或者首次推送时:
bash
git push -u origin main