-
Notifications
You must be signed in to change notification settings - Fork 0
Issue 29
- 类型:功能;状态:已实现,待 PR 审阅合并
- Issue:https://github.com/ShaoClean/remote-git/issues/29
- PR:https://github.com/ShaoClean/remote-git/pull/38
- 更新:2026-09-16
- 基线:development@f0fddaabdf7f6614c9228ad3998f085494c8b12e
- 实现:bcc9beb
原仓库页面只能访问登记目录,无法发现其他关联工作区。用户确认参考 GitLens:在新的顶部标签打开 worktree,提供完整仓库操作,并自动加入左侧仓库列表。这样可以复用按仓库 ID 隔离的状态、Diff、提交草稿及 Git 操作。
支持发现已有 worktree、查看未提交改动和现有 Git 操作;不创建、删除 worktree,不增加跨分支提交比较,也不改变标签和草稿的跨重启恢复规则。
- 分支信息旁的 Worktrees 按钮按需打开列表,不阻塞本地仓库登记列表或页面。
- 显示完整路径、分支或游离 HEAD、当前项、locked/prunable 信息。当前项不可重复打开,locked 不阻止使用,bare 条目说明没有工作目录。
- 点击后重新验证目录和 Git 归属,登记或复用仓库 ID,打开并激活独立标签。重复点击复用标签;关闭标签保留登记和远端目录。
- 各工作区使用自己的仓库 ID 和路径。状态与 Diff 请求使用请求序号隔离;草稿沿用会话内保存。迟到的打开结果可登记,但页面已经离开时不再抢走焦点。
- 没有其他 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 与代码独立版本管理,回退时需同步核对本文。