Skip to content

Issue 187

clean edited this page Oct 5, 2026 · 1 revision

Issue #187:文件预览支持逐行追溯(Blame)

背景与问题

文件视图原先只能阅读代码,无法直接判断每一行的作者和提交来源。追查变更需要离开预览运行 git blame。

目标与范围

文件预览提供逐行追溯开关,显示作者、相对时间、提交摘要,合并连续属于同一提交的行。悬停和键盘聚焦展示完整提交说明、哈希、作者邮箱和日期;点击在提交历史中选中对应提交。支持父版本及重命名路径追溯、未提交行、忽略空白和 .git-blame-ignore-revs。

本地、Worktree 与 SSH 共用实现。仅支持 UTF-8 文本;Markdown 使用源码追溯。Diff 视图不加入此功能。

方案与取舍

  • 共享 GitBlame 通过现有 RepositoryTransport 执行 git blame --line-porcelain,保留每行的原始行号、路径、前一版本与忽略标记,提交元数据按哈希聚合。完整提交说明在悬停时按需读取并缓存。
  • 新增只读 /repositories/:id/blame 和 /repositories/:id/blame-commit 接口。版本限定为完整哈希,路径沿用仓库内路径和符号链接限制。
  • 界面中的逐行栏、行号、代码共用滚动区域;延续代码字体、字号和主题。未提交行明确标记,不开放提交跳转。
  • 父版本通过 porcelain 的 previous 信息确定提交和旧路径,使用零上下文 diff 映射行号。新增、改写的行没有精确前身时,标明相邻位置定位;首次提交、新文件、浅克隆边界没有父版本时禁用操作。
  • 从显示内容和行归属生成快照标识;上一版本请求重新核对快照,发现文件变化则要求刷新,避免旧行号跳错位置。
  • 提交跳转直接加载目标提交及其祖先,并延续该范围的分页,不依赖前 50 条历史。用户可选择「查看全部历史」。
  • 超过 256 KiB 或 5000 行提示使用终端;Git 输出有硬上限,查询与连接准备整体限时 15 秒。二进制、非 UTF-8、空文件、无权限和不存在的文件分别给出状态。
  • 忽略文件从当前工作区读取,默认启用,可关闭;格式错误会报错,不静默跳过。

验收标准

  • 多作者、未提交行的归属与命令行 Git 一致。
  • 连续行合并,完整悬停信息与键盘聚焦可用。
  • 首屏历史之外的旧提交可以跳转并选中。
  • 重命名前的路径及父版本对应行可定位;新增/改写行标明相邻位置。
  • 忽略空白与忽略提交文件生效。
  • 本地、Worktree、隔离 SSH 服务中的真实 Git 验证通过。
  • 新文件、二进制、空文件、非 UTF-8、超限、取消和超时有验证。
  • 浅色、深色和 390px 布局完成浏览器实测,页面不横向溢出。
  • Windows/Linux 原生、外部 SSH 主机和桌面安装包验收(本次未运行)。

验证记录

日期:2026-10-05。代码提交见页首;环境:macOS arm64、Node.js 25.5.0。SSH 使用本机隔离 SSH/SFTP 服务和临时 Git 仓库,无用户凭据。

命令或场景 结果与证据
npm run build -w @alune/shared、npm run build -w @alune/ssh-client、npm run build -w server、npm run build -w web 通过;Vite 保留大 chunk 提示
node --test packages/ssh-client/tests/blame.test.cjs 9 项通过:本地/SSH/Worktree、重命名父版本、空白与忽略文件、文件状态、CRLF/无末尾换行/特殊路径、取消、快照变化
npm test -w server -- --runInBand repository.controller.spec.ts repository.service.spec.ts 17 项通过,含连接超时后不得启动 Git
node --import ./apps/web/tests/resolve-ts.mjs --test apps/web/tests/blame-view.test.mjs apps/web/tests/history-store.test.mjs apps/web/tests/files-view.test.mjs apps/web/tests/code-appearance.test.mjs 39 项通过,含分组合并、相对时间、历史分页和既有文件/主题回归
node --test apps/web/tests/blame.integration.cjs 1 项通过,真实生产 HTTP 覆盖本地/SSH/Worktree、旧提交跳转、参数与快照校验及文件状态
浏览器:悬停、键盘聚焦、父版本、返回工作区、跳转提交 通过;重命名前文件显示正确路径与 7 行,定位第 2 行;旧提交被选中且显示 Diff
浏览器:关闭忽略文件,再开启忽略空白 第 6 行从 Formatter 恢复到 Alice,符合 Git 归属
浏览器:本地浅色、SSH 深色、390px 通过;390px 时页面宽度为 390px,注释栏 200px,代码区域单独横向滚动
Windows/Linux 原生、外部 SSH、桌面安装包 未运行,当前验证环境为 macOS 浏览器与本机隔离 SSH

共 66 项自动测试通过。复验可运行 node apps/web/tests/blame-fixture.cjs,输出本地/SSH/Worktree 界面地址,退出时清理临时仓库。使用说明与测试入口随代码维护。

改动前:现有文件阅读基线

以下复用 v0.7.0 README 文件阅读截图,展示已有行号与语法高亮;不是本次临时仓库的逐像素对照。

Alune 原有文件阅读

改动后:逐行追溯,390px 深色 SSH 预览

2026-10-05 在本次实现的临时演示仓库采集。可见作者与摘要分组、未提交行、忽略选项和行号。这里仅展示最终窄窗口截图,宽窗口深浅主题与悬停/跳转结果记录在上表。

Alune 逐行追溯窄窗口

风险、未决事项与回退

不修改 Git 工作区、索引或数据库结构。仅支持 UTF-8 文本和约定的体积/行数范围,首次提交或浅克隆可能没有父版本。父版本中的新增/改写行只能定位相邻位置,并在界面解释。历史范围切换复用现有分页,需要保留目标提交范围。

Windows/Linux 原生、外部 SSH 主机、真实桌面安装包尚未验收,不能将隔离 SSH 验证视为所有远端部署均已验证。回退代码提交即可移除入口与新增只读接口;Wiki 有独立历史,需要单独记录回退。

关联资料

Clone this wiki locally