第 10 章:Git、代码审查与任务 Provider
1. 三层 source control
Git 负责 working tree 和 commit graph;GitHub/GitLab 负责 PR/MR、review、checks 和 Issue。两者不能混为一个 provider。
2. Git runner 是执行路由器
git/runner.ts 不只是 execFile('git') 的薄封装。它处理:
- native、WSL 与 SSH 命令路由;
- path 参数转换;
- timeout、AbortSignal 与 process tree kill;
- maxBuffer 和 streaming;
- 非交互环境、credential prompt guard;
- locale 固定,保证错误解析稳定;
- Git optional locks;
gh/glabhost 与 rate limit;- transient read-only retry。
非幂等 gh 写操作不会因为网络错误自动重放,避免重复 comment/merge。
3. Status 不是 git status --short 的字符串
Orca 需要 staged/unstaged/untracked、rename、冲突、行数、ahead/behind、branch、upstream 等结构化信息。status parser 还要处理:
- porcelain 版本差异;
- 文件名编码与 NUL 分隔;
- 大量文件的性能;
- SSH output;
- watcher 触发的增量刷新;
- repo 暂时不可用。
结果进入 SourceControl sidebar、worktree card、memory collector 和 review UI。
4. Diff 与编辑器
renderer 支持:
- 单文件 diff;
- combined diff;
- staged / unstaged;
- 文件树虚拟化;
- 行级 comment;
- open original/modified;
- markdown/image/PDF 预览。
diff comment 是 Orca 自己的 review note,可被组装成 prompt 发回 Agent。它与 GitHub review comment 不必同时存在。
5. SourceControl 事务
典型操作:
- stage/unstage/discard;
- commit;
- pull/fetch/push;
- branch rename / switch;
- resolve conflict;
- create PR/MR;
- merge/rebase;
- fork sync。
每个操作都要考虑当前 execution host 和 Git capability。错误面向 Agent 修复时,会保留结构化上下文,但对 secret、remote URL credential 进行脱敏。
6. Fork、origin 与 upstream
Repo 保存 upstream identity 和 issueSourcePreference:
auto:有 upstream 则优先 upstream,否则 origin;upstream:用户明确选择;origin:用户明确选择。
为什么有三态而不是布尔值?因为“当前 heuristic 恰好选 upstream”不同于“用户明确要求 upstream”。远端拓扑变化不能悄悄改变用户选择。
7. GitHub/GitLab client
平台 client 提供:
- repo/issue/PR/MR 定位;
- comments、labels、assignee;
- project views 和字段;
- checks、review threads;
- create/close/merge;
- avatar 与 metadata cache。
优先使用 gh/glab 复用用户认证,同时做 hostname qualification 和 rate-limit scope。对于远程 repo,CLI 需要在正确 host 或通过明确 fallback 执行。
8. Tasks 是多 provider 聚合
Task page 可汇总:
- GitHub Issue / PR;
- GitLab Issue / MR;
- Linear issue;
- Jira issue。
TaskSourceContext 携带 provider、project/repo/team 等上下文,避免只用一个 number 造成跨 repo/provider 冲突。
从任务创建 workspace 时,linked item 被写入 WorktreeMeta 或 FolderWorkspace,后续 card、branch name、PR 和状态同步都可使用。
9. Hosted review cache
PR/MR 页面需要同时展示:
- 远端 diff 与本地 working tree;
- checks 与 review state;
- comments 和 thread;
- branch 是否已经 checkout;
- repo host identity。
cache key 必须包含 provider/host/repo/item,不可只按 PR number。后台 refresh 还要防止一个旧请求覆盖用户刚切换到的新 item。
10. AI 辅助 commit 与 PR
commit message / PR generation 不是 renderer 直接调外部模型,而是通过 main 的 text-generation 环境选择:
- 读取 diff,设置大小边界;
- 选择可用 Agent/account/runtime;
- 生成建议;
- renderer 允许用户编辑;
- 最终 Git/平台写操作仍独立确认执行。
AI 文本和副作用分离,能避免一次生成失败或幻觉直接改变仓库。
11. Push 失败的恢复
push 失败可能来自:
- non-fast-forward;
- auth;
- branch protection;
- fork/upstream target;
- remote hooks;
- 网络或 SSH。
Orca 可把结构化失败交给 Agent 做恢复建议,但不会把所有错误都盲目重试。尤其 push 是副作用,网络不确定时需要先重新读取 remote 状态。
12. 大仓库性能
SourceControl 是大仓库的热点。策略包括:
- streaming 与 maxBuffer;
- file count / diff size 上限;
- watcher coalescing;
- virtualized file list;
- worktree/status scan 并发限制;
- changed-only code quality scripts;
- 专门的 source-control scale E2E。
13. 源码导航
- Git runner:
src/main/git/runner.ts - status:
src/main/git/status.ts - source control main:
src/main/source-control/ - GitHub client:
src/main/github/client.ts - renderer SourceControl:
src/renderer/src/components/right-sidebar/SourceControl.tsx - diff viewer:
src/renderer/src/components/editor/CombinedDiffViewer.tsx - Task page:
src/renderer/src/components/TaskPage.tsx