Repository navigation
Issue 187
- 类型:功能
- 状态:已实现,待 PR 审阅与合并
- Issue:https://github.com/ShaoClean/Alune/issues/187
- PR:https://github.com/ShaoClean/Alune/pull/196
- 最近更新:2026-10-05
- 代码基线:
development/c567e48 - 实现提交:
b36bb1bb5bf37ee3ed2619f359eff9a0e0feaa6f
文件视图原先只能阅读代码,无法直接判断每一行的作者和提交来源。追查变更需要离开预览运行 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 文件阅读截图,展示已有行号与语法高亮;不是本次临时仓库的逐像素对照。

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

不修改 Git 工作区、索引或数据库结构。仅支持 UTF-8 文本和约定的体积/行数范围,首次提交或浅克隆可能没有父版本。父版本中的新增/改写行只能定位相邻位置,并在界面解释。历史范围切换复用现有分页,需要保留目标提交范围。
Windows/Linux 原生、外部 SSH 主机、真实桌面安装包尚未验收,不能将隔离 SSH 验证视为所有远端部署均已验证。回退代码提交即可移除入口与新增只读接口;Wiki 有独立历史,需要单独记录回退。
设计文档首页 · Alune 品牌说明 · 维护约定 · 代码仓库