Issue 168 - ShaoClean/Alune GitHub Wiki

Issue #168:仓库列表增加工作区标识

背景与问题

打开同一个仓库的关联工作区(Git worktree)后,左侧仓库列表出现名称完全相同的条目,缺少工作区标识,难以判断每个条目对应哪个工作目录。

用户截图中,“本机”分组下有两个 alune,图标与名称相同,只能看出哪个条目被选中,无法直接分辨主工作区与关联工作区,也容易在切换或删除仓库登记时选错对象。

复现步骤:

  1. 打开一个包含关联 worktree 的仓库。
  2. 从该仓库打开关联工作区,使两个工作目录都出现在仓库列表中。
  3. 观察左侧列表:两个条目显示相同仓库名,缺少可见的工作区区分信息。

以上来自用户反馈与截图;截图对应版本未提供,尚未进行运行时复现。

目标

在保留仓库名称的同时,为工作区增加清晰可见的标识,让用户无需逐项点击或悬停即可区分同一仓库的不同工作区。

需求与范围

  • 在左侧仓库列表中区分主工作区与关联工作区,增加中文标签、图标或辅助文字。
  • 同一仓库有多个关联工作区时,需要显示能区分各工作区的信息,例如工作区目录名或简短路径;仅给所有条目添加相同的“工作区”标签不能解决重名问题。
  • 完整路径可通过悬停查看;可辅助显示分支名,但不能只依赖分支名,需考虑 detached HEAD 等情况。
  • 保留现有仓库打开、切换、排序、状态展示及删除登记行为。

方案建议与代码线索

静态核对当前提交 140b81f9ad68c5347a6a4bc97f5f848d65d66690:WorkspaceTree.tsx 中所有仓库行使用相同图标,可见文字为 repo.name,路径仅放在 title 中,未展示工作区标识。

建议采用“仓库名 + 工作区标识 + 简短区分信息”的呈现方式,具体布局与工作区身份数据来源在实现时确定。

验收标准

  • 同时打开主工作区与关联工作区时,左侧列表能直接辨认各自身份。
  • 同一仓库打开多个关联工作区时,每个条目都有可区分的信息。
  • 长名称、窄侧栏和浅色/深色主题下标识仍清晰可读,完整路径可查看。
  • 无分支名或 detached HEAD 时仍可区分工作区;普通同名仓库不会仅因名称相同被误标为关联工作区。
  • 点击条目仍打开对应工作目录,仓库切换、排序、状态展示及删除登记无回归。

验证方案

使用一个主工作区和至少两个关联 worktree(含 detached HEAD),检查列表标识、路径提示与实际打开的工作目录;补充普通同名仓库及窄侧栏、浅色/深色主题回归,并记录前后截图。

风险与待确认

此项已在本次实现中确认:使用中文标签与路径辅助文字,身份读取 Git 目录信息;具体实现、缓存与兼容边界见下方记录。

补充资料

Alune 仓库列表:本机分组下两个同名 alune 条目缺少工作区标识

验证记录

2026-10-02:根据用户提供的截图记录问题,并静态核对仓库列表渲染。尚未实现、运行时复现或执行回归验证。界面方案参考 UI 规范,实际实现与验收结果后续补充。

实现方案(2026-10-02)

代码基线:378192e;实现:f59311a,跨平台测试路径修正:d32c295。PR:#174。继承现有 UI 规范 的主题 token 和行交互,没有扩展全局组件规范。

  • Git 身份:读取绝对 git-dir 和 git-common-dir;相同为主工作区,不同为关联工作区。与仓库名称、分支名称及 detached HEAD 无关,本地和 SSH 共用实现。
  • 异步加载:沿现有可见仓库状态队列读取;身份查询额外限时 1.5 秒,失败或超时不改变原有 Git 状态结果,迟到结果不写缓存。
  • 本机缓存:登记表新增可空 worktree_kind 列,成功读取后更新。登记列表始终只读 SQLite;未确认身份前仅显示名称与路径,离线/重启后保留已确认标签,后续状态刷新重新核验。
  • 侧栏:保留仓库名称,增加中文身份和目录路径。同一主机内采用最短可区分的路径后缀;同名目录自动扩展父目录。路径可换行,完整名称、身份和路径同时用于悬停提示和按钮可访问名称。身份不依赖颜色。
  • 行操作:图标和状态占首行,标签和路径使用完整内容宽度;保持打开目标、排序、状态指示及删除登记回调。删除确认继续显示完整路径。

新增列可由旧版本忽略;回退代码无需删除缓存列。每次状态读取增加两条只读 Git 命令。缓存反映上次确认身份,离线期间不会推断变化。

实际验收(2026-10-02)

macOS arm64,Node 25.5.0,Git 2.43.1,Electron 44.2.0。使用隔离 SQLite、临时真实 Git 仓库和 loopback SSH,截图不含真实连接凭据。以下为对早期“尚未实现、尚未运行”记录的新增验证,并非修改历史验证结论。

场景 / 命令 结果
npm test -w web 233/233 通过;路径后缀、同名普通仓库、Windows / POSIX 路径、状态和登记刷新、排序等
npm test -w server -- --runInBand 25 suites、276/276 通过;真实 Git 身份、SQLite 缓存/重建服务、超时和迟到结果
npm test -w server -- --runInBand local-git.spec.ts 修正测试使用 Git 返回的路径后再次通过 18/18
node --test packages/ssh-client/tests/worktrees.test.cjs 5/5 通过;真实 SSH 主工作区/关联/游离 HEAD、别名与子目录、隔离暂存
shared / ssh-client / server / web 构建 通过
npm run desktop:build 6 个任务全部成功
npm run test:worktrees -w desktop 通过;桌面主/关联标签、路径、独立暂存、切换、关闭、detached 与 320px 布局
ego-browser,真实本地与 SSH 服务 同名主工作区 + 两个关联目录 + 独立同名仓库正确显示身份与区分路径;SSH 列表同样正确
真实 SSH 停止后刷新 登记列表立即返回;重新加载后仍显示主工作区及两个关联工作区的缓存身份
点击、搜索、排序、移除登记 点击后核对 main.txt / feature.txt / detached.txt 和实际分支;路径搜索和 Alt+↑/↓ 排序通过;移除普通同名仓库登记后磁盘目录仍存在,可重新登记
视觉 1280px 窗口、236px 与 184px 侧栏、浅色/深色,长名称和路径可读,无页面/路径横向溢出,完整路径 title 可访问

桌面旧测试最初在关闭标签后立即点击尚未挂载的 Worktree 按钮而失败;现已等待目标页面按钮出现,并增加此次身份断言后重新通过。

Windows / Linux 桌面视觉交互未在本机运行;跨平台服务测试结果以 PR CI 为准。没有创建发布包或合并 PR。

前后截图

修改前,同名条目仅显示仓库名称:

修改前:同名 alune 条目

修改后,236px 侧栏:

修改后:主工作区、关联工作区和目录路径

184px 窄侧栏,浅色与深色:

184px 浅色侧栏

184px 深色侧栏

真实 SSH 分组及工作区切换:

SSH 工作区身份与路径

后续优化:方案 A(2026-10-02)

初版完成身份识别后,用户要求精简行高并让标签页同样可辨认,已确认使用方案 A。列表与标签页改用统一的类型图标、短名称和完整详情;设计对照、前后截图、238 项前端测试及真实 SSH / Electron 回归见方案 A 验收。本次 PR:#177;上方初版方案及验收保留为历史记录。