Skip to content

Issue 120

clean edited this page Sep 28, 2026 · 2 revisions

Issue #120:变更列表中的目录、嵌套仓库与 Worktree

背景与复现

在已有提交的仓库内执行 git worktree add -b demo .claude/worktrees/demo,同时新增普通文件,打开“改动”面板。Git 即使使用 --untracked-files=all,仍会把嵌套仓库和 Worktree 返回为以 / 结尾的目录条目。

旧版通过 split('/').pop() 取名称,导致目录名称为空,统一使用文件图标,并提供不适用的差异、暂存、删除入口。后端虽然拒绝删除目录,但批量放弃遇到这些条目时也会整体失败。直接去掉 / 再暂存会把嵌套仓库记录为 160000 Git 提交引用。

方案

  • 在状态模型中补充目录、嵌套仓库、Worktree、子模块类型和可打开的仓库路径。保留 Porcelain v2 子模块的提交变化、内部修改及未跟踪状态。
  • 普通目录继续显示内部文件;特殊条目使用目录/仓库图标、真实名称和类型标识。子模块仍可查看和暂存提交指针变化,仅有内部改动时不显示无效暂存按钮。
  • 嵌套仓库及 Worktree 提供说明、打开仓库和本地忽略入口,不提供单文件暂存/删除。Worktree 打开复用已有验证流程,移除仍使用专用管理入口。重复打开同一连接与路径的嵌套仓库时复用已登记仓库,避免重复登记。
  • 全部暂存先列出跳过项。批量放弃的预览返回跳过路径与原因,并把跳过范围纳入确认 token;保留现有 HEAD、索引、内容和路径变化校验。文件被目录替换时跳过整个目录及其子项。
  • 暂存和单文件丢弃接口重新核验实际磁盘路径,禁止把嵌套仓库或目录当作单文件处理;支持安全的目录到文件暂存替换。
  • 本地忽略仅接受仍处于未跟踪状态的目录。向公共 Git 元数据目录下的 info/exclude 追加经过转义的精确目录规则,兼容关联 Worktree;保留原内容,不修改 .gitignore。换行路径与符号链接形式的忽略文件会被拒绝。
  • 本地和 SSH 共用实现;跨平台本地 Git CI 已加入新的回归用例。

验收标准

  • 目录名称、图标、Worktree/嵌套仓库/子模块类型正确。
  • 普通文件与子模块提交指针的差异、暂存、取消暂存正常。
  • 特殊目录提供打开入口,不显示普通文件删除/暂存按钮。
  • 批量操作明确展示跳过范围,其他普通文件可正常处理。
  • 本地忽略保留磁盘文件及团队 .gitignore,支持带空格和特殊字符的目录。
  • 接口直接调用仍受路径、目录、嵌套仓库与子模块边界保护。

验证记录

环境:macOS 15.5 / arm64,Node.js 25.5.0;2026-09-29。

检查 结果
npm test -w @alune/ssh-client 133 通过,2 个原有平台用例跳过;包含真实 SSH/SFTP、子模块、Worktree、目录替换、特殊路径、忽略规则与符号链接保护
npm test -w web 161 通过;补充仓库登记复用后已重跑,并重新构建 web
npm test -w server -- --ci --runInBand 20 suites、201 测试通过;包含 HTTP 直接调用目录暂存/丢弃/忽略与跳过预览
shared、ssh-client、web、server 构建 通过;Vite 保留已有的大 chunk 提示
git diff --check、相关文件 Prettier、commitlint 通过
浏览器验收 ego-browser + 真实 HTTP/Git fixture;见下方步骤与截图

浏览器使用 apps/web/tests/change-entries-fixture.cjs 的独立临时数据目录,不接触用户仓库:

  1. 列表同时显示普通修改、新文件、子模块指针变化、嵌套仓库和 Worktree。确认目录名称非空、类型标识和按钮正确。
  2. 打开 Worktree 详情并进入 demo-worktree 分支,返回父仓库。
  3. 点击全部暂存:确认窗口列出两个跳过目录;确认后仅三项改动进入暂存区,随后全部取消暂存成功。
  4. 点击放弃所有更改:预览显示跳过三个目录/子模块。勾选删除未跟踪文件后,只恢复一个普通文件、删除一个普通新文件,三个特殊条目仍保留。
  5. 本地忽略 Worktree:确认后该条目消失,磁盘工作目录保留。嵌套仓库的打开入口也能进入对应仓库。

前图为用户报告截图;后图和确认窗口来自上述临时测试仓库,演示数据不同。

修复前:目录名称为空且显示文件操作

修复后:真实名称、类型标识及对应操作

批量暂存显示跳过项

批量放弃显示跳过路径与影响范围

边界与回退

不提供嵌套仓库递归删除或完整子模块管理;目录类型变化无法作为普通单文件恢复时,保留目录并提示单独处理。带换行的目录仍可显示,但不能写入行式忽略文件。忽略规则由同一仓库的 Worktree 共享,可删除对应规则恢复显示。

本地已完成 macOS 与真实 SSH/SFTP 验证;Windows/Linux 由 PR 的跨平台 CI 验证,远端 Windows GUI 尚未手动验收。运行时类型扩展无需数据库迁移。代码可通过回退该修复提交恢复;已添加的本地忽略规则需单独移除,Wiki 也有独立历史。

Clone this wiki locally