ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

fish_shell 的 fish_git_prompt:打造信息丰富、可深度定制的 Git 提示符

fish_shell 的 fish_git_prompt:打造信息丰富、可深度定制的 Git 提示符 CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载导读fish_git_prompt是 fish-shell 内置的提示符辅助函数用于在交互式提示符中展示当前 Git 仓库的分支、脏状态、暂存状态、上游领先/落后、stash 与未跟踪文件等信息。它支持通过 fish 变量与 git config 双层配置并内置了普通与 informative 两种显示模式。读完本文你将掌握fish_git_prompt的全部配置项、字符与颜色定制方法并能依据 share/functions/fish_git_prompt.fish 的源码与 tests/checks/git.fish 的测试用例独立构建属于自己的 Git 提示符。基本用法在 fish_prompt 中接入 Git 信息fish_git_prompt的函数签名如下fish_git_prompt [FORMAT]最简单的接入方式是在自定义的fish_prompt函数中调用它function fish_prompt printf %s $PWD (fish_git_prompt) $ end它会把当前 Git 仓库的信息以默认格式 (%s)输出——即一个空格、一对圆括号包裹的分支状态。需要说明的前提是系统必须安装 Git否则函数直接返回 1什么都不输出见 share/functions/fish_git_prompt.fish 中开头的command -sq git检查。此外在 macOS 上函数会额外检测/usr/bin/git是否为未安装 Xcode Command Line Tools 时的 stub并在后台预热 xcrun 缓存后再开始工作避免第一次调用弹出对话框或长时间卡顿。FORMAT参数用于替换默认的 (%s)%s会被替换为计算出的仓库状态字符串。例如fish_git_prompt [git:%s]兼容旧名__fish_git_promptfish 提供了__fish_git_prompt作为已弃用的别名见 share/functions/__fish_git_prompt.fish其注释明确标注deprecated它只是简单地转发给fish_git_prompt $argv。新代码请直接使用fish_git_prompt。配置体系git 选项优先于 fish 变量fish_git_prompt的所有布尔开关都支持两种配置来源fish 变量以__fish_git_prompt_为前缀用set命令设置git 选项即bash.show*系列配置用git config设置可作用于单仓库--local或全局--global。当两者同时存在时git 选项优先于同名 fish 变量。这一点在源码中体现得很直接函数通过git config -z --get-regexp bash\.(showInformativeStatus|showDirtyState|showUntrackedFiles)读取仓库本地配置来覆盖 fish 变量默认值见 share/functions/fish_git_prompt.fish 第 248 行附近。布尔选项开启/关闭类的取值规则统一为1、yes、true表示真其余任意值表示假。源码中的判定即contains -- $var yes true 1。因此set -g __fish_git_prompt_showdirtystate 1、true或yes三者等价。核心开关从精简模式到 informative 模式show_informative_status信息密集模式fish 变量$__fish_git_prompt_show_informative_statusgit 选项bash.showInformativeStatus设为1/true/yes后启用 informative 显示提示符将展示大量信息脏文件数量、暂存数量、未合并数量、未跟踪文件数量、stash 条目数以及相对上游领先/落后的具体提交数。同时字符会从不那么朴素的普通符号切换为更直观的符号——例如脏状态用✚而非*。在大型仓库中计算这些信息会显著拖慢每次提示符渲染因此官方建议对大仓库单独关闭git config --local bash.showInformativeStatus false由于 git 选项优先于 fish 变量这可以精确地对单仓库覆盖全局设置。如果你只想换符号、不想开启完整的信息计数可以单独设置$__fish_git_prompt_use_informative_chars它会让字符变量切换到 informative 版本如✚、●、⚑但不做计数。注意未跟踪文件的数量因为需要遍历文件系统、开销很大只有在$__fish_git_prompt_showuntrackedfiles或 git 选项bash.showUntrackedFiles显式开启时才会统计见 share/functions/fish_git_prompt.fish 中__fish_git_prompt_informative_status对-unormal与-uno的选择非 informative 路径也会用git ls-files快速判断。showdirtystate脏状态fish 变量$__fish_git_prompt_showdirtystategit 选项bash.showDirtyState开启后若仓库存在未提交的改动dirty提示符会显示对应的状态字符。showuntrackedfiles未跟踪文件fish 变量$__fish_git_prompt_showuntrackedfilesgit 选项bash.showUntrackedFiles开启后若存在未被.gitignore忽略的未跟踪文件显示未跟踪状态字符。如前所述统计其数量仅在 informative 模式且显式开启时才进行。showupstream与上游的比较方式$__fish_git_prompt_showupstream是一个列表值可同时指定多项函数会按顺序解析见 share/functions/fish_git_prompt.fish 中__fish_git_prompt_show_upstream的for option in $show_upstream循环决定如何展示 HEAD 与上游之间的差异值行为auto汇总 HEAD 与其上游的差异默认git 或 svn 自动探测verbose显示领先/落后上游的具体提交数N/-Nname配合verbose时额外显示上游的简写名称abbrev nameinformative类似verbose但双方相等时不显示任何内容开启 informative 状态时的默认行为git总是将 HEAD 与{upstream}比较svn总是将 HEAD 与 SVN 上游比较none禁用在 informative 状态下用于单独关掉这一项源码层面__fish_git_prompt_show_upstream会先读取bash.showupstream与svn-remote.*.url配置再通过git rev-list --count --left-right $upstream...HEAD计算领先/落后数最后按0 0相等、0 *领先、* 0落后、*分叉四种情况输出对应的上游字符。SVN 模式则从提交信息中的git-svn-id:提取上游位置并支持通过GIT_SVN_ID或默认git-svn分支名回退。showstashstatestash 状态fish 变量$__fish_git_prompt_showstashstate开启后显示 stash 的状态。源码中通过检查并计数$git_common_dir/logs/refs/stash文件的行数来判断 stash 条目数——这比调用git stash list更快见 share/functions/fish_git_prompt.fish 第 316 行附近。在 informative 模式下stash 计数同样通过count logs/refs/stash完成。shorten_branch_len分支名截断fish 变量$__fish_git_prompt_shorten_branch_len设置为一个数字时分支名会被截断到该字符数。源码使用string shorten -m $__fish_git_prompt_shorten_branch_len实现还可以配合$__fish_git_prompt_shorten_branch_char_suffix指定截断后的后缀字符如…。describe_styleHEAD 的描述方式当处于 detached HEAD检出某个提交而非分支时$__fish_git_prompt_describe_style决定如何描述当前 HEAD值含义示例输出contains相对于较新的注解标签(v1.6.3.2~35)branch相对于较新的标签或分支(master~4)describe相对于较老的注解标签(v1.6.3.1-13-gdd42c2f)default完全匹配的标签(develop)当以上方式都不适用时回退为缩短到 8 个字符的提交 SHA。这在源码 share/functions/fish_git_prompt.fish 的__fish_git_prompt_operation_branch_bare中体现先尝试git describe系列命令失败后string shorten -m8 -c -- $sha若连 SHA 都拿不到则输出unknown并用(branch)包裹表示 detached 状态。showcolorhints颜色提示fish 变量$__fish_git_prompt_showcolorhints开启后分支名与各状态符号会使用颜色区分正常分支为绿色detached 分支为红色脏/暂存等状态也会着色。字符与颜色定制全套变量参考以下变量控制提示符中各个指示符号的字符与颜色。文档给出的格式是「普通模式默认值informative 模式默认值若不同则列出」颜色若无特别默认值则回退到$__fish_git_prompt_color。通用字符与颜色变量普通默认informative 默认说明$__fish_git_prompt_char_stateseparator \|各状态字符之间的分隔符$__fish_git_prompt_color无无基础颜色其余颜色回退目标$__fish_git_prompt_color_prefix——(前缀的颜色$__fish_git_prompt_color_suffix——)后缀的颜色$__fish_git_prompt_color_bare——bare 仓库无工作树的颜色$__fish_git_prompt_color_merging——正在 merge/rebase/revert/bisect/cherry-pick 时的颜色$__fish_git_prompt_char_cleanstate空✔仓库干净时显示的字符$__fish_git_prompt_color_cleanstate无无干净状态的颜色从源码 share/functions/fish_git_prompt.fish 的__fish_git_prompt_validate_chars可以看出cleanstate只有在 informative 模式才默认为✔普通模式默认为空字符串不显示。showdirtystate 相关变量普通默认informative 默认说明$__fish_git_prompt_char_dirtystate*✚未暂存的改动数量$__fish_git_prompt_char_invalidstate#✖未合并unmerged的改动数量$__fish_git_prompt_char_stagedstate●已暂存且无额外改动的文件数量$__fish_git_prompt_color_dirtystate开启 showcolorhints 时为红色否则同 color_flags$__fish_git_prompt_color_invalidstate—$__fish_git_prompt_color_stagedstate开启 showcolorhints 时为绿色否则同 color_flagsshowstashstate 相关变量默认值说明$__fish_git_prompt_char_stashstate$informative 为⚑stash 符号$__fish_git_prompt_color_stashstate同 color_flagsstash 颜色showuntrackedfiles 相关变量默认值说明$__fish_git_prompt_char_untrackedfiles%informative 为…未跟踪文件符号$__fish_git_prompt_color_untrackedfiles同 color_flags未跟踪颜色showupstream 相关informative 状态下同样生效变量默认值说明$__fish_git_prompt_char_upstream_aheadinformative 为↑领先上游的符号$__fish_git_prompt_char_upstream_behindinformative 为↓落后上游的符号$__fish_git_prompt_char_upstream_divergedinformative 为↓↑同时领先又落后分叉的符号$__fish_git_prompt_char_upstream_equal与上游相等的符号$__fish_git_prompt_char_upstream_prefix上游信息前的可选前缀$__fish_git_prompt_color_upstream—上游信息的颜色showcolorhints 相关颜色变量默认值说明$__fish_git_prompt_color_branch绿色无特殊状态时分支的颜色$__fish_git_prompt_color_branch_detached红色detached HEAD 时分支的颜色$__fish_git_prompt_color_branch_dirty无分支脏且未 detached 时的颜色$__fish_git_prompt_color_branch_staged无仅暂存、其余干净时的颜色$__fish_git_prompt_color_flags--bold blue脏/暂存/stash/未跟踪状态的默认颜色_done颜色后缀所有颜色变量都可以有对应的_done变体例如$__fish_git_prompt_color_upstream_done。_done颜色的内容会打印在对应信息之后通常用于关闭该颜色段源码中默认以set_color --reset实现从而让下一个颜色段不受影响。从源码看实现细节操作状态、性能与自动重置仓库操作状态检测除上述配置外函数会自动识别当前仓库正在进行的 Git 操作。在 share/functions/fish_git_prompt.fish 的__fish_git_prompt_operation_branch_bare中依次检查以下目录/文件并输出对应的操作标记rebase-merge/|REBASE-i交互式或|REBASE-m附带step/total进度rebase-apply/|REBASE、|AMapply mailbox或|AM/REBASEMERGE_HEAD|MERGINGCHERRY_PICK_HEAD|CHERRY-PICKINGREVERT_HEAD|REVERTINGBISECT_LOG|BISECTING。这些标记使用$__fish_git_prompt_color_merging着色。同时该函数还会处理 bare 仓库前缀BARE:与在.git目录内的情况分支显示为GIT_DIR!。性能相关的实现策略在非 informative 模式下如果只需要未跟踪信息函数会用git ls-files --others --exclude-standard --directory --no-empty-directory快速探测如果同时需要脏与未跟踪信息则用git status --porcelain源码注释指出这样约快 10%~20%。命令中统一传入-c core.fsmonitor以禁用 fsmonitor避免第三方钩子干扰tests/checks/git.fish 第 219-224 行专门验证了 fsmonitor 与 sshCommand 等配置不会被执行。重命名rename/copy在 porcelain-z输出中会多出一个 NUL 分隔的源路径字段__fish_git_prompt_status_porcelain_modulo_rename_source会跳过这些额外字段避免把一次重命名误计为两次变更对应 issue #11296测试见 tests/checks/git.fish 第 164-181 行。状态顺序与变量监听重置$__fish_git_prompt_status_order控制状态字符的输出顺序默认值为stagedstate invalidstate dirtystate untrackedfiles stashstate可以像测试中那样覆盖为任意子集以只显示关心的状态。由于字符与颜色默认值依赖当前是否开启 informative 模式fish 为这些变量注册了--on-variable事件处理器__fish_git_prompt_reset、__fish_git_prompt_reset_color、__fish_git_prompt_reset_char见 share/functions/fish_git_prompt.fish 第 686-708 行一旦用户修改相关__fish_git_prompt_*变量或showcolorhints缓存的计算结果会被清除并在下次渲染时重新初始化因此修改配置后提示符立即生效无需重启 fish。这也解释了为什么测试文件 tests/checks/git.fish 需要在交互模式-i下运行——变量监听处理器依赖status is-interactive。测试验证来自 tests/checks/git.fish 的预期输出仓库自带的集成测试 tests/checks/git.fish 给出了大量可直接对照的预期输出可以帮助你直观理解各配置的效果配置仓库状态预期输出默认干净分支newbranch(newbranch)show_informative_status 1干净(newbranch\|✔)show_informative_status 1showuntrackedfiles 12 个未跟踪文件(newbranch\|…2)showdirtystate 1已暂存文件(newbranch )showdirtystate 1showuntrackedfiles 1已暂存 未跟踪(newbranch %)status_order untrackedfiles stagedstate同上(newbranch %)showdirtystate 1有未暂存改动(newbranch *)informative stashstash 1 条(newbranch\|1)informative 重命名重命名已暂存(newbranch\|●1)例如测试第 87-90 行验证设置__fish_git_prompt_show_informative_status 1后干净仓库输出(newbranch|✔)而第 99-102 行验证 informative 模式默认不数未跟踪文件只有显式设置showuntrackedfiles才输出…2。这些用例与 vcs-prompts 测试针对 rebase 状态中分支名含转义序列的场景共同构成了fish_git_prompt的行为契约。与 fish_vcs_prompt 的关系多版本控制统一入口如果你同时使用 Git、Mercurial、Darcs、Subversion 甚至 Jujutsu可以改用 fish_vcs_promptfunction fish_prompt ... set -g __fish_git_prompt_showupstream auto printf %s %s$ $PWD (fish_vcs_prompt) end从 share/functions/fish_vcs_prompt.fish 的源码看它的调用链是fish_jj_prompt→fish_git_prompt→fish_hg_prompt→fish_darcs_promptor短路一旦某个函数成功输出即停止而fish_fossil_prompt与fish_svn_prompt因在大型仓库中较慢被注释默认禁用可按需取消注释开启。相关文档还有 fish_hg_prompt、fish_darcs_prompt、fish_svn_prompt。综合示例一个完整可用的配置结合前面所有开关这里给出一个开箱即用的配置可直接放入~/.config/fish/config.fish或交互式会话中# 开启 informative 显示计数 丰富符号 set -g __fish_git_prompt_show_informative_status 1 # 单独控制信息项统计未跟踪文件数量 set -g __fish_git_prompt_showuntrackedfiles 1 # 显示与上游的领先/落后差异informative 默认 verbose 风格 set -g __fish_git_prompt_showupstream auto # 显示 stash 状态 set -g __fish_git_prompt_showstashstate 1 # 分支名截断到 15 个字符超出加省略号 set -g __fish_git_prompt_shorten_branch_len 15 set -g __fish_git_prompt_shorten_branch_char_suffix … # 开启颜色提示 set -g __fish_git_prompt_showcolorhints 1 function fish_prompt printf %s%s (prompt_pwd) (fish_git_prompt) end对于不希望统计未跟踪文件的大仓库可以在该仓库内执行git config --local bash.showInformativeStatus false git config --local bash.showUntrackedFiles false由于 git 选项优先于 fish 变量这两条命令会精确地压低该仓库的提示符开销同时不影响其他仓库。更多配置项细节可查阅 fish_git_prompt 完整文档 与 fish_vcs_prompt 文档实现源码见 share/functions/fish_git_prompt.fish行为契约见 tests/checks/git.fish。赞分享CLI开发工具【免费下载链接】fish-shellThe user-friendly command line shell.项目地址https://gitcode.com/GitHub_Trending/fi/fish-shell点击查看免费下载相关推荐Powerline PDB Segments 完全指南为 Python pdb 调试器打造信息丰富的状态提示符Powerline PDB Segments 完全指南为 Python pdb 调试器打造信息丰富的状态提示符 Powerline 的 PDB 扩展把状态栏的开发工具CLIOmni命令参数验证错误提示友好且信息丰富的反馈Omni命令参数验证错误提示友好且信息丰富的反馈 你是否曾在使用命令行工具时因参数输入错误而收到一堆晦涩难懂的提示Omni作为一款致力于提升生产力的一体化开发工具deeplearning4j libnd4j Requirements Helper 深度指南用信息丰富、可短路求值的 C 参数校验替代 REQUIRE_TRUEdeeplearning4j libnd4j Requirements Helper 深度指南用信息丰富、可短路求值的 C 参数校验替代 REQUIRE_深度学习人工智能机器学习分布式训练上一篇SuperClaude Framework 的 /sc:research 深度研究命令自适应规划、多跳推理与证据合成实战指南下一篇Stable Diffusion WebUI DirectML3分钟解锁AMD GPU的AI绘画性能飞跃创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表