Skip to content

Issue 19

clean edited this page Sep 17, 2026 · 3 revisions

Issue #19:[功能] 为新增文件添加删除操作

Issue #19 · PR #22 · 实现方案与验收记录

2026-09-16 从 Issue 迁入的需求与方案快照,保留原始验收勾选状态;当前进度以关联 Issue / PR 为准。实现细节、验收证据和未验证项见上方记录。

背景与问题

远端仓库中的新增文件目前没有删除按钮,用户无法在 RemoteGit 改动列表中直接移除误建或不再需要的文件。

代码核对基线:development@30d9947。当前删除图标对应「丢弃改动」,仅在 !file.staged && file.status !== 'untracked' 时展示,并调用 checkout;未跟踪文件及已暂存的新文件均没有删除入口。

目标

为新增文件提供清晰的「删除文件」操作,参考 GitLens 对未跟踪文件和新增文件的处理,使删除结果与远端磁盘、暂存区和界面状态一致。

需求与范围

  • 未跟踪的新文件(untracked / ??)显示删除按钮;已暂存且首次新增的文件(added / A)也应有明确的删除入口。
  • 点击后确认目标文件路径及删除影响;已暂存的新文件需明确说明会移除暂存内容,取消确认不产生改动。
  • 删除未跟踪文件后,目标文件从远端磁盘和改动列表消失。删除已暂存的新文件时,同时清理该路径的暂存记录,不能残留待提交的新增内容。
  • 新文件若同时存在已暂存和未暂存内容,完整删除的范围应明确告知用户;「丢弃未暂存改动」与「删除整个新增文件」保持清晰区分。
  • 操作期间显示进度并防止重复提交;成功后刷新文件列表、计数和 Diff 选中状态;失败时说明原因并保留可重新操作的界面。
  • 本项聚焦单个新增文件;只处理用户选择的目标路径,不扩大为整个仓库清理或递归删除目录。

方案建议与代码线索

  • 前端入口:ChangesView.tsx,现有丢弃逻辑见 discardFile。服务端操作入口:git.controller.ts;远端文件能力:file.service.tsconnection-manager.ts。当前文件服务尚无删除接口。
  • GitLens 参考:discard.utils.ts 的 classifyFilesForDiscard / discardOneWith。它根据最新状态区分未跟踪、已暂存及混合改动;对于未跟踪/纯新增文件,移入回收站、按需取消暂存,且不尝试从不存在的 HEAD 版本恢复;混合改动则采用不同逻辑以保留暂存内容。
  • 建议增加针对仓库内单个新增文件的删除能力,服务端重新核验文件状态和目标路径,处理文件已变化、已消失及操作部分失败。远端文件删除不能仅复用 git checkout

验收标准

  • 未跟踪文件和已暂存的新文件均有可识别、可通过键盘操作的删除入口。
  • 确认框清楚展示目标路径和影响;取消操作后远端文件及暂存区保持原样。
  • 确认删除后目标文件实际消失,列表和计数自动更新,已暂存新增内容不会残留在下一次提交中。
  • 新文件同时有已暂存/未暂存内容时,执行结果符合确认范围;不影响其他文件和已跟踪文件原有的丢弃改动行为。
  • 中文、空格及常见特殊字符文件名、子目录文件可准确删除;不误删父目录、其他文件或仓库外路径。
  • 权限不足、连接中断、文件状态变化及部分步骤失败时反馈准确,不误报成功;删除当前预览文件后清除过期 Diff。

验证方案

使用隔离的远端测试仓库,分别验证未跟踪文件、已暂存新增文件、暂存后再编辑的新文件,以及尚无首次提交的仓库。覆盖确认与取消、特殊文件名、只读权限、断连和文件已被外部修改/删除;同时核对远端磁盘、Git 状态和暂存区内容,并回归已有文件的暂存、取消暂存和丢弃改动。

风险与待确认

GitLens 使用回收站,但 SSH 远端未必提供相同能力。是否采用远端回收目录或直接删除在实现时确定,确认文案必须与实际可恢复性一致;删除与清理暂存区无法保证跨步骤原子性时,应明确报告部分完成状态并刷新真实结果。

补充资料

用户要求与「新增文件差异预览」拆分为两个功能 issue,两项均参考 GitLens 实现。以上为需求与源码分析,尚未实施或完成运行验证。

Clone this wiki locally