本文档解释了 Powerlevel10k 如何与 Git 集成,在您的提示符中提供实时的仓库状态信息。该集成使用 gitstatus 插件和 gitstatusd 守护进程,可以高效地检索 Git 状态,即使在大型仓库中也不会阻塞 shell。
Git 集成是 Powerlevel10k 的核心功能,它会在您的提示符中直接显示仓库状态、分支信息和变更跟踪。有关配置 Git 信息外观的信息,请参阅 配置系统。
Powerlevel10k 中的 Git 集成由几个相互关联的组件组成,它们协同工作以高效地检索和显示 Git 状态信息。
来源: gitstatus/gitstatus.plugin.zsh1-12 internal/p10k.zsh53-55
该架构的关键组件包括
当 Powerlevel10k 被加载时,它会初始化 Git 集成系统
来源: gitstatus/gitstatus.plugin.zsh480-521 gitstatus/gitstatus.plugin.zsh765-766
初始化分以下几个步骤进行
gitstatus_start 并传递一个名称(通常是 "POWERLEVEL9K")gitstatus_start 函数接受几个参数来控制行为
| 选项 | 描述 |
|---|---|
| -t FLOAT | 守护进程响应超时时间(默认:5 秒) |
| -s INT | 要报告的最大暂存更改数(默认:1) |
| -u INT | 要报告的最大未暂存更改数(默认:1) |
| -d INT | 要报告的最大未跟踪文件数(默认:1) |
| -m INT | 在报告简化状态之前的最大索引大小(默认:-1) |
| -e | 计算未跟踪目录中的文件数 |
来源: gitstatus/gitstatus.plugin.zsh480-509
当 Powerlevel10k 需要更新提示符时,它会通过一个定义明确的过程查询 Git 状态
来源: gitstatus/gitstatus.plugin.zsh64-145 internal/p10k.zsh552-584
gitstatus_query 函数接受以下主要参数
| 选项 | 描述 |
|---|---|
| -d STR | 要查询的目录(默认为当前目录) |
| -c STR | 结果可用后要调用的回调函数 |
| -t FLOAT | 超时时间(秒)(负数表示无限) |
| -p | 不要计算任何需要读取 Git 索引的操作 |
来源: gitstatus/gitstatus.plugin.zsh64-75
查询完成后,它会设置许多 VCS_STATUS_* 变量
| 可变 | 描述 |
|---|---|
| VCS_STATUS_RESULT | 查询结果:"ok-sync", "norepo-sync", "tout" |
| VCS_STATUS_WORKDIR | Git 仓库工作目录 |
| VCS_STATUS_COMMIT | HEAD 指向的提交哈希 |
| VCS_STATUS_LOCAL_BRANCH | 本地分支名称,或 HEAD 分离时的空字符串 |
| VCS_STATUS_REMOTE_NAME | 远程名称(例如:"origin") |
| VCS_STATUS_REMOTE_BRANCH | 上游分支名称 |
| VCS_STATUS_REMOTE_URL | 远程 URL |
| VCS_STATUS_ACTION | 仓库状态/操作(merge, rebase, 等) |
| VCS_STATUS_INDEX_SIZE | 索引中的文件数 |
| VCS_STATUS_NUM_STAGED | 暂存的更改数 |
| VCS_STATUS_NUM_UNSTAGED | 未暂存的更改数 |
| VCS_STATUS_NUM_UNTRACKED | 未跟踪的文件数 |
| VCS_STATUS_HAS_STAGED | 如果存在暂存更改,则为 1,否则为 0 |
| VCS_STATUS_HAS_UNSTAGED | 如果存在未暂存的更改,则为 1,否则为 0 |
| VCS_STATUS_HAS_UNTRACKED | 如果存在未跟踪的文件,则为 1,否则为 0 |
| VCS_STATUS_COMMITS_AHEAD | 领先于上游的提交数 |
| VCS_STATUS_COMMITS_BEHIND | 落后于上游的提交数 |
| VCS_STATUS_STASHES | 暂存数 |
来源: gitstatus/gitstatus.plugin.zsh89-134
Powerlevel10k 为 Git 状态在提示符中的显示提供了广泛的自定义。VCS 线段样式通过一组函数和变量进行处理,这些函数和变量根据仓库状态控制颜色、图标和格式。
来源: internal/p10k.zsh556-584 internal/icons.zsh90-105 internal/icons.zsh254-276
Powerlevel10k 为不同的 Git 状态使用不同的样式
| 状态管理 | 描述 | 默认样式 |
|---|---|---|
| CLEAN (干净) | 无未提交的更改 | 绿色背景 |
| MODIFIED (已修改) | 有未提交的更改 | 黄色背景 |
| UNTRACKED (未跟踪) | 有未跟踪的文件 | 蓝色背景 |
| CONFLICTED (有冲突) | 有合并冲突 | 红色背景 |
VCS 线段使用专门的图标来表示 Git 操作
| 图标变量 | 描述 | 示例(Nerdfont) |
|---|---|---|
| VCS_GIT_ICON | Git 图标 | `` |
| VCS_BRANCH_ICON | 分支图标 | `` |
| VCS_STAGED_ICON | 暂存更改 | `` |
| VCS_UNSTAGED_ICON | 未暂存的更改 | `` |
| VCS_UNTRACKED_ICON | 未跟踪的文件 | `` |
| VCS_STASH_ICON | 暂存 | `` |
| VCS_INCOMING_CHANGES_ICON | 落后于上游的提交数 | `` |
| VCS_OUTGOING_CHANGES_ICON | 领先于上游的提交数 | `` |
Powerlevel10k 中的 Git 集成包含了多项性能优化,以确保即使在大型仓库中也能保持您的 shell 响应迅速
Git 状态查询是异步运行的,因此在检索状态信息时,提示符会保持响应。这是通过 Zsh 的文件描述符监控系统(zle -F)实现的。
来源: gitstatus/gitstatus.plugin.zsh729-740
对于大型仓库,Powerlevel10k 可以在不计算完整状态详细信息的情况下检测仓库是否有未提交的更改。这由 gitstatus_start 的 -m 选项控制,该选项指定了完整状态计算的最大索引大小。
来源: gitstatus/gitstatus.plugin.zsh498-501 gitstatus/gitstatus.plugin.zsh354-364
Git 集成使用缓存来避免重复查询。例如,当您多次访问同一个目录时,如果缓存的状态可用,将使用缓存的状态。
gitstatusd 守护进程实现为一个独立的进程,通过管道与 shell 通信。这种架构提供了许多优点:
来源: gitstatus/gitstatus.plugin.zsh380-478
Git 状态信息通过 VCS 线段集成到 Powerlevel10k 提示符中,该线段在大多数提示符配置中默认包含。
要将 VCS 线段包含在您的提示符中,请确保它列在您的提示符元素中
或者,也可以
在 Git 仓库中时,VCS 线段会显示以下信息:
Powerlevel10k 的 Git 集成可在你的提示符中提供高效且信息丰富的 Git 状态显示。通过利用高性能的 gitstatus 插件和 gitstatusd 守护进程,它提供了详细的 Git 信息,而不会影响 shell 的响应能力,即使是在大型存储库中也是如此。
有关自定义 Git 状态信息外观的信息,请参阅 配置系统页面。