Repository navigation
Issue 109
- 类型:功能
- 状态:已实现,草稿 PR 待审阅
- Issue:https://github.com/ShaoClean/Alune/issues/109
- PR:https://github.com/ShaoClean/Alune/pull/115
- 最近更新:2026-09-28
- 代码基线:
development/7fa5bdb;实现提交c0fd92d0a005aaec463cfae71b3380cc9e776afb
Alune 改动面板原先只能逐个丢弃未暂存改动或删除单个新增文件,多文件试验清理需要反复确认或使用终端。本功能提供整仓库批量入口,并将「保留暂存区」与「删除未跟踪文件」的范围明确区分。
在当前仓库 / 当前 worktree 内处理全部未暂存改动,搜索筛选只影响显示。已跟踪的修改和删除恢复到暂存区版本;同一文件同时有两类改动、已暂存的新文件再次编辑、尚无首次提交等情况都保留已暂存内容。默认保留未跟踪文件,用户明确选择后才逐个直接删除。忽略文件、其他仓库和其他 worktree 不纳入范围。
不清空暂存区,不使用整仓库 hard reset,也不复用「删除整个新增文件」的暂存区清理行为。
「未暂存」分组增加「放弃所有更改」按钮,没有未暂存文件时随分组隐藏。确认框从服务端读取实际数量和仓库名称/路径,显示「整个当前仓库 / worktree,不受文件列表筛选影响」。默认操作为「仅放弃已跟踪更改」;勾选「同时删除 N 个未跟踪文件」后,确认按钮变为「放弃全部并删除」,并说明直接删除、不进入回收站、Git 无法恢复。
仅有未跟踪文件时,默认按钮禁用,仍需主动勾选删除。取消不调用写接口。执行中禁用重复确认、取消、遮罩关闭及 Esc;前端同步 ref 防止双击产生两次写入。失败后清除旧确认快照,重试必须重新读取并选择范围。
成功、失败和部分完成都会调用现有写后刷新机制,更新列表、计数及当前 Diff。即使文件的 Git 状态仍为 M,内容变化后 Diff 也会重新读取。
-
POST /repositories/:id/discard-changes/preview返回仓库信息、已跟踪/未跟踪数量和确认 token。 -
POST /repositories/:id/discard-changes接收 token 及scope: tracked | all,目标路径始终由服务端状态生成,不接收前端筛选文件列表。 -
DiscardChanges在本地LocalConnection与 SSH/SFTP 上共用逻辑。读取status --porcelain=v2 -z --untracked-files=all --ignore-submodules=none、暂存区条目和文件内容指纹,关闭 Git 可选锁,使预览不写暂存区。 - token 绑定仓库路径、HEAD/分支、完整状态、暂存区和目标文件内容。确认后重新核验;同状态、同大小、同时间戳的内容变化也会被检测。
- 执行复用现有仓库 Git 写操作锁。每步重新检查剩余目标、HEAD/分支、暂存区及当前文件指纹/父目录,发生变化后停止后续操作。
- 已跟踪文件逐路径执行
git restore --worktree --no-recurse-submodules -- <literal-path>。未跟踪文件只调用单文件 unlink,不递归清理目录,不使用git clean。 - 路径从 NUL 分隔 Git 输出读取,使用严格 UTF-8、字面 pathspec 和结构化本地参数 / SSH 安全引用。路径遍历、符号链接父目录、嵌套仓库和特殊文件均阻止;未跟踪符号链接只移除链接本身。
- 合并冲突、脏子模块、意向添加(
git add -N)、目录替代文件等特殊状态统一阻止,并给出处理原因。本次选择整批阻止,而非静默跳过危险目标。
执行返回已恢复、已删除、未完成、无法确认数量及错误原因。操作遇错停止,但不回滚已完成步骤;再读取真实状态生成结果。SSH 断连、取消或超时导致无法核验时明确报告未知结果,不假定全成功。忽略规则因恢复 .gitignore 而变化时也会停止,避免继续删除已经变为忽略状态的文件。
- 明确的批量入口;筛选不会改变实际作用范围。
- 确认显示仓库、数量及删除影响;取消不修改磁盘和暂存区。
- 修改、删除、暂存后再次编辑及暂存新文件恢复正确,暂存内容不变。
- 未跟踪文件只有明确选择后才删除,忽略文件与其他 worktree 保持不变。
- 无目标、重复点击、状态变化、失败/部分完成都有准确反馈,列表与 Diff 刷新。
- 本地和真实 loopback SSH/SFTP 使用一致语义,覆盖特殊路径和断连。
- Windows/Linux 原生桌面交互验收;三平台本地 Git 自动回归结果见 PR checks。
详细命令、结果和截图见 Issue-109-Validation。本机为 macOS 15.5 arm64 / Node 25.5.0 / Git 2.43.1;本次新增 25 项底层与 6 项 HTTP 回归通过,完整服务端 186 项、前端 151 项、SSH/Git 115 项通过,2 项 Windows 专用测试在本机跳过。
- 依赖 Git 2.23+ 的
restore;无数据库或设置迁移。 - 未跟踪文件直接删除,不进入回收站;应用不提供恢复功能。
- 批量操作不是文件系统事务。应用内锁无法约束外部编辑器/Git 的同时写入,指纹检查和写入之间仍存在操作系统层面的竞态窗口;逐步重检和最终核验用于停止后续操作并报告实际结果。
- 逐文件校验优先保证范围,大仓库/高延迟 SSH 可能需要更长时间;沿用现有 5 分钟写操作超时,超时后报告未确认结果。
- Windows/Linux 桌面及 Windows OpenSSH 实机未在本机验证;本地 Git 测试已加入三平台 CI。
- 回退代码提交即可移除入口与接口,既有单文件操作不变;回退代码不能恢复已经放弃的数据。Wiki 修订需单独回退。
设计文档首页 · Alune 品牌说明 · 维护约定 · 代码仓库