Skip to content

fix(Branches): 修复 Delete Remote Branch 对陈旧远程分支误报失败且吞掉真实原因 - #147

Merged
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/remote-branch-delete-fix
Oct 17, 2026
Merged

ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/remote-branch-delete-fix

Conversation

@ThreeFish-AI

Copy link
Copy Markdown
Owner

问题

rsi 等仓库的 origin/rsi/fixture-terminology 类远程分支,在 Branches 视图右键「Delete Remote Branch」删除直接报错:

Deleted 0 remote branches, 1 failed: origin/rsi/fixture-terminology

无任何失败原因,且此类分支「经常」删不掉。

根因(已在 rsi 仓库实证)

复合缺陷,两个 Bug 叠加:

  1. 目标态已达成却按失败收尾:PR 合并后 GitHub 自动删除远端分支,本地 remote-tracking ref 在下一次 fetch --prune 前一直陈旧,视图仍列出;对它执行 git push origin --delete 被服务端拒绝(git 2.54 实测 stderr:error: unable to delete 'x': remote ref does not exist)。
  2. 真实原因被吞:remote-commands.ts 删除循环的 catch {} 把 execGit 已透传挂载的 stderr 整个丢弃,最终只回显笼统的「N failed」,不可诊断。

修复

  • engine 纯逻辑(src/engine/ref/remote-ref.ts,零 vscode 依赖):
    • isRemoteRefMissingError:识别「服务端已无此 ref」的 push 失败(stderr 优先,匹配 remote ref does not exist / delete of non-existent ref 变体);
    • formatRemoteDeleteResult:把逐分支删除结果三桶(成功 / 服务端已不存在 / 真失败)汇总为通知文案与级别。
  • adapter(src/adapter/remote-commands.ts):
    • 删除循环改三桶:「服务端已无此 ref」按目标态达成收尾,并把本地陈旧 tracking ref 纳入既有 branch -D -r 清理(通知如实标注 already gone on remote);
    • 真失败经 stderr 优先的 errMsg 提取原因(与 history-commands.ts 同款先例),通知中逐分支附上真实原因,失败走 showGitError 联动 Show Output 查看完整输出;
    • 确认弹窗、受保护主干硬阻断、上游软警示等既有逻辑一律不动。

验证

  • pnpm run check-types ✅、pnpm run lint ✅、pnpm test:unit ✅(493/493,含新增 18 个用例:分类器实测文案命中/变体/负例,三桶汇总全组合/截断/单复数/级别);
  • 实机回归路径:F5 起 Extension Development Host 打开 rsi 仓库,右键陈旧的 origin/rsi/fixture-terminology → Delete Remote Branch → 应显示「already gone on remote (pruned local tracking ref)」且视图中幽灵 ref 消失;对真实存在/受保护的远端分支分别验证成功与带原因失败两条路径。

🤖 Generated with Claude Code

- 服务端已无此 ref(PR 合并后远端自动删除、本地 tracking ref 未 prune)时,
  push --delete 被拒的「remote ref does not exist」不再误报失败——按目标态已
  达成收尾,并把本地陈旧 tracking ref 纳入 branch -D -r 清理;
- 真失败(保护分支拒绝/认证/网络等)经 stderr 优先提取原因,通知中逐分支附上
  真实报错并联动 Show Output,替换原先 catch{} 吞错后的笼统「N failed」;
- engine 纯逻辑新增 isRemoteRefMissingError / formatRemoteDeleteResult
  (零 vscode 依赖),新增 18 个单测覆盖分类与三桶汇总。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- 抽取 engine/git-state/git-error.ts 的 gitErrorText 作为「stderr 优先提取」
  单一事实源,remote-commands 与 history-commands 两处内联 errMsg 改为引用,
  消除本 PR 引入的同逻辑第三份拷贝与语义漂移面;
- formatRemoteDeleteResult 零计数段省略(仅陈旧项时不再以「Deleted 0 remote
  branches」开头)并复用 truncateNames 截断(SSOT);isRemoteRefMissingError
  空白 stderr 回退 message 与 errMsg 守卫语义对齐;
- issue.md #19 同步 gitErrorText 术语;新增/强化 20 个单测(494 全绿)。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
@ThreeFish-AI
ThreeFish-AI merged commit 49bf43f into feature/1.x.x Oct 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant