fix(source-control): 修复 submodule 分支切换出现 HEAD 及不实时刷新的问题#339
fix(source-control): 修复 submodule 分支切换出现 HEAD 及不实时刷新的问题#339J3n5en merged 2 commits intoJ3n5en:mainfrom
Conversation
- GitService.checkout/checkoutSubmoduleBranch: 切换远程分支时提取本地分支名, 优先切换已有本地分支,不存在则通过 -b --track 创建追踪分支,避免进入 detached HEAD - SourceControlPanel: submodule 分支切换改用 useCheckoutSubmoduleBranch, 使 onSuccess 以 rootPath 为 key 正确失效缓存,切换后立即刷新分支名显示 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
- 提取重复的远程分支处理逻辑为私有方法 checkoutRemoteBranch - 改进错误处理:区分分支不存在和其他错误(如未提交变更),避免掩盖真实异常 - 修复 Toast 提示:显示实际切换到的本地分支名而非原始远程分支名 解决 PR J3n5en#339 代码审查中提出的 3 个问题
|
Claude finished @lwt-sadais's task in 2m 4s —— View job 🔍 代码审查报告
📊 审查概览 · 一目了然
🏆 代码质量评分📋 问题分布🎯 关键发现
✅ 亮点本次 PR 解决了两个明确的 bug,修复思路清晰,代码组织良好:
🎯 问题详细分析 · 📊 点击展开查看📊 **👆 点击此处展开详细统计和图表分析**📈 问题趋势分析
🐛 问题清单与修复指南 · 📋 点击展开查看📋 **👆 点击此处展开详细问题列表 (共 3 个问题) · 一键复制追踪 📌**
|
| 🎯 优先级 | 🚨 严重 | ⚡ 轻微 | 📈 总计 | |
|---|---|---|---|---|
| 🔴 P0 | 0 个 | - | - | 0 个 |
| 🟡 P1 | - | 1 个 | - | 1 个 |
| 🔵 P2 | - | - | 2 个 | 2 个 |
| 📊 合计 | 0 | 1 | 2 | 3 个 |
🎯 合并决策建议
📋 合并评估结果
| 📊 评估维度 | ⭐ 得分 | 🎯 状态 | 💭 说明 |
|---|---|---|---|
| 🔐 安全性 | 10/10 | ✅ 通过 | 无安全风险,仅涉及 git 分支操作 |
| 📊 代码质量 | 8/10 | ✅ 优秀 | 结构清晰,公共方法提取合理,注释规范 |
| ⚡ 性能影响 | 10/10 | ✅ 无影响 | 仅修改分支切换逻辑,无额外性能开销 |
| 🛠️ 功能完整性 | 8/10 | ✅ 完整 | 修复了两个明确 bug,多 remote 边缘场景可后续优化 |
| 🧪 测试覆盖 | 6/10 | 无自动化测试覆盖,需手动验证 |
📈 综合评分: 42/50 分 · 等级: 良好
🚦 最终建议
✅ 建议合并
📝 详细理由:
- 🟢 修复思路正确,准确定位了 detached HEAD 和缓存 key 不匹配两个根因
- 🟢 提取
checkoutRemoteBranch公共方法,消除了代码重复- 🟢
useCheckoutSubmoduleBranch的onSuccess正确失效['git', 'submodules', workdir]和['git', 'submodule', 'branches', ...]缓存- 🟢 无安全或性能问题
- 🟡 多 remote 边缘场景为已知限制,不影响当前主流用例
🎯 具体行动建议:
-
本版本可选改进:
- 考虑将
slice(8)替换为slice('remotes/'.length)提升可读性
- 考虑将
-
后续版本改进:
- 补充
checkoutRemoteBranch的单元测试(正常切换、新建追踪分支、多层路径分支名) - 考虑多 remote 场景下的分支名冲突处理
- 提取分支名 normalize 为共享工具函数
- 补充
问题描述
版本管理面板中切换 submodule 分支存在两个 bug:
HEAD:选择远程分支(如remotes/origin/dev)后,submodule 进入 detached HEAD 状态,分支名显示为HEAD根因分析
Bug 1 — detached HEAD
GitService.checkout()对远程分支名的处理不完整:checkoutSubmoduleBranch()完全没有 normalize 逻辑,同样修复。Bug 2 — 缓存 key 不匹配
handleBranchCheckout对 submodule 误用了useGitCheckout,其onSuccess以 submodule 绝对路径失效缓存,但useSubmodules的 queryKey 是主仓库路径,两者永不匹配,只能靠 10s 轮询补救。修复方案
src/main/services/git/GitService.tscheckout()和checkoutSubmoduleBranch()统一处理remotes/前缀:提取本地分支名,try checkout / catch 创建追踪分支src/renderer/components/source-control/SourceControlPanel.tsxhandleBranchCheckout根据 submodule 列表判断目标仓库类型useCheckoutSubmoduleBranch,其onSuccess以rootPath正确失效['git', 'submodules', rootPath]缓存,切换后立即刷新测试方式
remotes/origin/xxx)HEAD,且分支名立即更新无需等待