Skip to content

Issue 29

clean edited this page Sep 17, 2026 · 2 revisions

Issue #29:关联 Worktree 与独立仓库标签

背景与范围

原仓库页面只能访问登记目录,无法发现其他关联工作区。用户确认参考 GitLens:在新的顶部标签打开 worktree,提供完整仓库操作,并自动加入左侧仓库列表。这样可以复用按仓库 ID 隔离的状态、Diff、提交草稿及 Git 操作。

支持发现已有 worktree、查看未提交改动和现有 Git 操作;不创建、删除 worktree,不增加跨分支提交比较,也不改变标签和草稿的跨重启恢复规则。

交互与数据流

  1. 分支信息旁的 Worktrees 按钮按需打开列表,不阻塞本地仓库登记列表或页面。
  2. 显示完整路径、分支或游离 HEAD、当前项、locked/prunable 信息。当前项不可重复打开,locked 不阻止使用,bare 条目说明没有工作目录。
  3. 点击后重新验证目录和 Git 归属,登记或复用仓库 ID,打开并激活独立标签。重复点击复用标签;关闭标签保留登记和远端目录。
  4. 各工作区使用自己的仓库 ID 和路径。状态与 Diff 请求使用请求序号隔离;草稿沿用会话内保存。迟到的打开结果可登记,但页面已经离开时不再抢走焦点。
  5. 没有其他 worktree 时显示明确空状态;发现失败、目录失效、权限不足和超时有错误及重试。状态失败不会回退到其他目录,也不作为成功的空改动列表。

接口与目录校验

接口 输入与结果
GET /api/repositories/:id/worktrees WorktreeInfo 数组:path、head、branch、detached、bare、locked、prunable、原因及 isCurrent
POST /api/repositories/:id/worktrees/open 请求体包含所选 path;返回现有 Repository 对象

SSH 层读取 git worktree list --porcelain -z,保留空格、中文、引号和换行。命令复用安全参数引用;Windows 使用编码 PowerShell 调用 Git,并将 SFTP 的 /C:/ 形式转换为 Git 可用的 C:/ 形式。输出限制为 1 MiB;服务端查询总期限 10 秒,客户端期限 12 秒。

打开前在最新列表中核对路径,通过 SFTP realpath 规范化目录,确认目标是工作区根目录,并比较双方的 Git common directory。目标缺失、被普通子目录或另一仓库替代时均报错。超时之后的迟到结果不能写入登记。

按同一连接下的规范化路径复用登记,已有符号链接别名也可复用。远程校验完成后,在 SQLite 事务中再次检查原登记和目标路径,查询与插入之间不等待异步操作,避免并发重复登记。无需数据库迁移;本地仓库列表仍不执行 SSH。

验收标准

  • 从主目录或关联 worktree 发现其他工作区,区分分支与游离 HEAD。
  • 独立标签中的已暂存、未暂存、未跟踪文件及 Diff 对应正确目录。
  • 重复打开复用登记和标签,关闭后仍可从左侧打开。
  • 乱序请求、快速切换和草稿不会串入其他工作区。
  • 在目标工作区暂存/提交不修改其他工作区的文件与暂存区。
  • 空状态、失效目录、权限不足、读取失败及超时有明确反馈。
  • macOS Web 与 Electron 验收通过,包括 320px 窄窗口。

命令、截图及限制见验收记录

兼容、限制与回退

远端 Git 需支持 worktree list --porcelain -z 和 rev-parse --path-format=absolute;不支持时显示错误,不使用会破坏路径语义的降级解析。Windows/Linux 实机、Windows OpenSSH 和外部 SSH 主机未验收,不能将本机 loopback SSH 结果视为跨平台认证。

回退代码不删除已加入的仓库登记,这些记录仍是旧版本可读取的普通 Repository。需要移除时使用既有仓库管理功能,不删除远端 worktree。Wiki 与代码独立版本管理,回退时需同步核对本文。

Clone this wiki locally