Skip to content

feat(Branches): 远程分支支持右键删除(git push --delete)#42

Merged
ThreeFish-AI merged 1 commit into
feature/1.x.xfrom
ThreeFish-AI/almaty-v2
Jun 30, 2026
Merged

feat(Branches): 远程分支支持右键删除(git push --delete)#42
ThreeFish-AI merged 1 commit into
feature/1.x.xfrom
ThreeFish-AI/almaty-v2

Conversation

@ThreeFish-AI

Copy link
Copy Markdown
Owner

背景

Branches 视图中,远程分支origin/foo)的右键菜单缺少删除操作——本地分支有「删除分支」(git branch -d/-D),远程分支无对应入口。远程分支删除是与之正交的另一机制:git push <remote> --delete <branch>,作用于服务器、影响协作者、不可撤销。本 PR 补齐该能力。

改动概要

新增独立命令 hyperGit.deleteRemoteBranch,挂载到远程分支右键菜单(与本地「删除分支」同槽位 1_branch@2,视觉对称),经 git push <remote> --delete <branch> 删除服务端分支。

文件清单

类型 文件 说明
新建 src/engine/ref/remote-ref.ts 纯逻辑:远程引用解析 + 受保护分桶 + 确认文案(零 vscode 依赖,可单测)
修改 src/adapter/remote-commands.ts 新增 hyperGit.deleteRemoteBranch handler
修改 package.json commands / view/item/context / commandPalette 各 +1 条
新建 tests/unit/ref-remote.test.ts 16 个单测

核心设计

  • 斜杠安全的 remote 解析resolveRemoteBranch 用「已知 remotes 列表」做最长前缀匹配拆分 {remote, branch},正确处理 remote 名含斜杠(如 fork 场景 myorg/repo);禁用朴素 split('/')[0](会把 myorg/repo/feature 错切成 myorg,推到不存在的 remote 甚至误删)。
  • 受保护主干硬阻断origin/main / origin/master 一律跳过并告知,复用 isProtectedBranch(SSOT),与本地删除硬阻断当前 HEAD 对称。
  • 诚实确认文案:modal 弹窗明确「服务器端不可逆 + 影响协作者」,按钮「删除」非默认(Cancel 默认);当前分支上游被删时追加 ⚠ 软警示(不硬阻断——本地分支与提交仍在,仅失远程追踪)。
  • 即时视图同步:删除成功后执行 git branch -D -r 清理本地 remote-tracking ref,分支在视图立即消失(清理失败非关键,下次 fetch --prune 自然收敛)。
  • 复用既有基建selectedBranchRefs(多选归一化)/ execGit / 统一 modal 确认范式 / truncateNames,零重定义;支持多选批量删除、失败汇总。不调用 handleGitConflict(删除不产生合并冲突)。

边缘场景

场景 处置
origin/main / origin/master 硬阻断(skip + 告知,绝不 push)
remote 名含斜杠(myorg/repo 最长前缀正确拆分
当前分支上游被删 ⚠ 软警示,不硬阻断
服务端已不存在 push --delete 非零退出 → 计入 failures(与本地 branchDelete 一致)
多选混合不同 remote 每 ref 独立解析、独立 push
多选含本地/标签节点 谓词 (r) => r.isRemote && !r.isTag 自动过滤
网络/认证/权限失败 单条入 failures、不中断后续;汇总提示

验证

  • pnpm check-types(tsc --noEmit,0 error)
  • pnpm lint(eslint 全量,0 error)
  • pnpm test:unit(vitest,30 文件 / 296 用例全绿,含新增 16 个)
  • node esbuild.js(打包通过)
  • ⏳ 手动 E2E(F5 扩展宿主 + 真实 remote):右键远程分支 → 「删除远程分支」→ modal 确认 → 服务端删除 + 视图即时消失;多选含 origin/main 自动跳过受保护;命令面板搜不到(when:false)。(待人工核验)

兼容性

  • 仅新增命令与菜单项,不改动既有 branchDelete / tagDelete / pushDialog 等行为;本地分支、标签删除流程不受影响。

🤖 Generated with Claude Code

- 新增 hyperGit.deleteRemoteBranch 命令,挂载到远程分支右键菜单(与本地「删除分支」同槽位 1_branch@2,视觉对称),commandPalette 以 when:false 隐藏
- 经 git push <remote> --delete <branch> 删除服务端分支,并对成功项执行 branch -D -r 即时清理本地 remote-tracking ref,使视图立即同步
- 新增纯逻辑 src/engine/ref/remote-ref.ts:
  · resolveRemoteBranch 用已知 remotes 做最长前缀匹配拆分 {remote, branch},remote 名含斜杠(如 myorg/repo)亦安全,禁用朴素 split('/')[0]
  · partitionRemoteByProtected 复用 isProtectedBranch(SSOT),硬阻断 origin/main、origin/master
  · formatRemoteDeleteConfirm 诚实传达「服务器端不可逆 + 影响协作者」,支持单/多选与当前分支上游软警示
- 复用 selectedBranchRefs(多选归一化)/ execGit / 统一 modal 确认范式,零重定义;不调用 handleGitConflict(删除不产生合并冲突)
- 新增 tests/unit/ref-remote.test.ts(16 个用例,覆盖斜杠安全/歧义/受保护分桶/确认文案)

🤖 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 4983647 into feature/1.x.x Jun 30, 2026
5 checks passed
@ThreeFish-AI ThreeFish-AI deleted the ThreeFish-AI/almaty-v2 branch June 30, 2026 13:02
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