git-bug bug show 命令完全指南:查看 Bug 详情、字段筛选与三种输出格式
【免费下载链接】git-bugDistributed, offline-first bug tracker embedded in git项目地址: https://gitcode.com/GitHub_Trending/gi/git-bug
git-bug是一个分布式、离线优先(offline-first)、内嵌于 Git 的缺陷跟踪工具。git-bug bug show是其中最常用的查看命令之一,用于展示单个 Bug 的完整详情——从标题、状态、作者到标签、参与者与全部评论。本文以 doc/md/git-bug_bug_show.md 为核心,结合 commands/bug/bug_show.go 的源码实现,完整讲解该命令的用法:如何定位 Bug、如何用--field只提取某个字段、如何用-f/--format切换 default/json/org-mode 三种输出风格,以及每种格式背后的字段来源与工作原理。读完本文,你可以熟练地用一条命令查看、筛选并脚本化处理仓库中的任何 Bug 详情。
命令概览
git-bug bug show [BUG_ID] [flags]- 功能:Display the details of a bug(展示一个 Bug 的详细信息)
- 所属命令组:
git-bug bug(见 git-bug bug 命令说明) - 对应 man 手册页:git-bug-bug-show.1
完整选项列表
| 选项 | 说明 | 取值 | 默认值 |
|---|---|---|---|
--field string | 只显示指定字段 | author, authorEmail, createTime, lastEdit, humanId, id, labels, shortId, status, title, actors, participants | 空(显示完整详情) |
-f, --format string | 选择输出格式 | default, json, org-mode | default |
-h, --help | 显示命令帮助 | — | — |
第一步:如何指定要查看的 Bug
show命令的BUG_ID参数支持两种用法,在 commands/select/select.go 的Resolve逻辑中统一处理:
1. 直接传 ID 前缀
git-bug的 Bug ID 是基于 sha-256 的 64 位十六进制字符串(见 entity/id.go)。为了人类可读,可以直接传前 7 个字符的短 ID(human id),甚至更短的前缀,命令会通过ResolvePrefix自动补全匹配:
git-bug bug show 2f153ca从源码结构看,ResolveSelected(commands/bug/bug_select.go)会优先把第一个参数当作实体前缀解析,成功匹配即直接使用,无需完整 ID。
2. 使用预先选中的 Bug(select 机制)
如果之前执行过git-bug bug select 2f15(commands/bug/bug_select.go),该短 ID 会被写入本地存储的select/bug文件中。之后执行:
git-bug bug show无需再传任何参数,show会自动读取预先选中的 Bug。配合git-bug bug deselect可以清除选中状态。若既没有传入有效 ID、也没有预先选中 Bug,命令会返回错误提示:
you must provide a bug id or use the "select" command first
字段筛选:--field 只输出你关心的内容
show命令最实用的能力之一是通过--field精确提取单个字段,非常适合 shell 脚本与自动化流水线。可用的 12 个字段在 commands/bug/bug_show.go 中定义,具体如下:
| 字段 | 输出内容 | 对应 Snapshot 来源 |
|---|---|---|
author | 作者显示名 | snap.Author.DisplayName() |
authorEmail | 作者邮箱 | snap.Author.Email() |
createTime | 创建时间 | snap.CreateTime.String() |
lastEdit | 最后编辑时间 | snap.EditTime().String() |
humanId | 短 ID(前 7 字符) | snap.Id().Human() |
id | 完整 ID | snap.Id() |
labels | 标签列表(每行一个) | snap.Labels |
shortId | 短 ID(同 humanId) | snap.Id().Human() |
status | 状态(open/closed) | snap.Status |
title | 标题 | snap.Title |
actors | 所有参与操作的身份显示名 | snap.Actors |
participants | 所有参与者显示名 | snap.Participants |
这些字段全部来自bug.Snapshot——Bug 的 DAG 操作链编译产物(见 entities/bug/snapshot.go)。
典型用法
# 只显示标题 git-bug bug show 2f153ca --field title # 只显示状态 git-bug bug show 2f153ca --field status # 只显示作者邮箱(适合后续脚本处理) git-bug bug show 2f153ca --field authorEmail注意:--field与--format是互斥的使用方式。从 runBugShow 的实现可见,一旦指定了--field,会走独立的 switch 分支并直接返回;只有未指定--field时才会按--format渲染完整详情。若传入不在列表中的字段名,会报错unsupported field: <名称>。
输出格式详解
未使用--field时,-f/--format控制完整详情的渲染风格,支持default、json、org-mode三种。
default:终端友好的彩色渲染
默认格式(showDefaultFormatter,commands/bug/bug_show.go)输出结构如下,并带 ANSI 颜色(短 ID 青色、状态黄色、作者名品红):
2f153ca [open] 标题文本 Alice opened this issue 2026-09-10 10:30:00 +0800 CST This was last edited at 2026-09-12 14:00:00 +0800 CST labels: bug, ui actors: Alice participants: Alice, Bob ab12cd3 #0 Alice <alice@example.com> 这里显示第一条评论(创建 Bug 时的描述)…… ef45ab6 #1 Bob <bob@example.com> 这里显示后续评论……关键细节:
- 评论渲染:每条评论前带
CombinedId().Human()短 ID(7 位)与序号(#0、#1……),后跟评论作者显示名与邮箱。CombinedId的实现见 entities/bug/comment.go。 - 空描述提示:某条评论没有正文时,会以高亮样式输出
No description provided.。 - 数据校验:
runBugShow在渲染前会检查snap.Comments是否为空,若为空会直接报错invalid bug: no comment(一个合法 Bug 至少包含创建时的第一条描述,见 commands/bug/bug_show.go)。
json:机器可读的结构化输出
json格式通过showJsonFormatter(commands/bug/bug_show.go)调用 commands/cmdjson/bug.go 中定义的BugSnapshot结构序列化输出,方便jq等工具进一步处理:
{ "id": "<完整 64 位 ID>", "human_id": "2f153ca", "create_time": { "timestamp": 1757497800, "time": "2026-09-10T10:30:00+08:00" }, "edit_time": { "timestamp": 1757743200, "time": "2026-09-12T14:00:00+08:00" }, "status": "open", "labels": ["bug", "ui"], "title": "标题文本", "author": {"id": "…", "human_id": "…", "name": "Alice", "login": "alice"}, "actors": [ {"id": "…", "human_id": "…", "name": "Alice", "login": "alice"} ], "participants": [ {"id": "…", "human_id": "…", "name": "Alice", "login": "alice"}, {"id": "…", "human_id": "…", "name": "Bob", "login": "bob"} ], "comments": [ { "id": "<CombinedId 完整值>", "human_id": "ab12cd3", "author": {"id": "…", "human_id": "…", "name": "Alice", "login": "alice"}, "message": "第一条评论内容" } ] }结构说明:
create_time/edit_time使用cmdjson.Time包装(commands/cmdjson/json_common.go),同时提供 Unix 时间戳与可读时间两个字段。author、actors、participants使用cmdjson.Identity(含id、human_id、name、login)。- 每条评论的
id是该评论的CombinedId(评论与所属操作组合成的实体 ID),human_id为其前 7 位短形式。
配合jq可以轻松做自动化提取,例如:
git-bug bug show 2f153ca --format json | jq '.title' git-bug bug show 2f153ca --format json | jq '.comments[].author.name'org-mode:Emacs Org 生态友好输出
org-mode格式(showOrgModeFormatter,commands/bug/bug_show.go)将 Bug 渲染为 Org 大纲结构,可以直接导入 Emacs Org 文件:
2f153ca [open] 标题文本 * Author: Alice * Creation Time: 2026-09-10 10:30:00 +0800 CST * Last Edit: 2026-09-12 14:00:00 +0800 CST * Labels: ** bug ** ui * Actors: ** a1b2c3d Alice * Participants: ** a1b2c3d Alice ** e4f5a6b Bob * Comments: ** #0 Alice : 第一条评论内容 ** #1 Bob : 第二条评论内容格式要点:
- 无 ANSI 颜色,纯文本更适合导入文档与版本管理。
Actors/Participants输出为短ID 显示名组合。- 评论正文以
:前缀缩进,多行内容会把换行符替换为\n:,保证 Org 块内格式一致。 - 若评论无正文,输出
No description provided.。
实现原理:从命令到 Snapshot 的调用链
理解show命令的底层原理,有助于把握各字段的真实含义。完整调用链如下:
- 命令入口:
newBugShowCommand(commands/bug/bug_show.go)注册 cobra 命令,并通过PreRunE: execenv.LoadBackend(env)在运行前加载仓库后端缓存。 - ID 解析:
ResolveSelected→_select.Resolve(commands/select/select.go),优先解析命令行参数中的 ID 前缀,失败则回退到 select 机制。 - 生成快照:
b.Snapshot()将 Bug 的 DAG 操作链重放、编译为bug.Snapshot结构。 - 字段渲染:按
--field或--format分发到对应的格式化函数。
其中 Snapshot 的EditTime()(entities/bug/snapshot.go)取的是操作链最后一条操作的时间戳;CreateTime则是快照中记录的创建时间;Actors与Participants由操作回放过程中去重累积(addActor/addParticipant,见 entities/bug/snapshot.go)。短 ID 的截取规则(前 7 位)定义在 entity/id.go 与 entity/id_interleaved.go。
实际使用建议
- 快速浏览:直接
git-bug bug show <shortId>,彩色输出一目了然。 - 脚本提取:优先用
--field拿单字段,或--format json拿全量结构化数据再交给jq。 - Org 工作流:若你日常使用 Emacs Org 管理任务,
-f org-mode可让 Bug 详情无缝嵌入 Org 大纲。 - 配合 select 提效:在交互式会话中先
git-bug bug select <shortId>,之后反复执行git-bug bug show查看同一 Bug,无需重复输入 ID。
相关命令与文档延伸:git-bug bug(列表)、git-bug bug select(预选)、git-bug bug deselect(取消预选)。
【免费下载链接】git-bugDistributed, offline-first bug tracker embedded in git项目地址: https://gitcode.com/GitHub_Trending/gi/git-bug
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考