Skip to content

Issue 185

clean edited this page Oct 6, 2026 · 2 revisions

Issue #185:Git 标签管理

背景与问题

提交图能显示标签,但应用中缺少创建、删除和单独推送入口,用户发布版本时仍需使用终端。

目标与范围

在分支页管理本地 Git 标签:显示名称、提交、轻量/附注类型和说明,支持搜索、创建、推送、确认删除及检出。在提交详情中允许基于任意历史提交创建标签。对本地、Worktree 与 SSH 使用一致的操作。

本次不包含标签签名和 GitHub/GitLab Release。远程只支持单个推送地址;不提供覆盖远程同名标签的强制推送入口。

方案与取舍

入口与交互

  • “分支”页增加标签分组,按 Git 版本名称倒序排列。搜索覆盖名称、提交哈希及附注。
  • “创建标签”默认指向 HEAD,历史详情中的入口固定到所选提交哈希。附注标签必须填写说明,重名和非法名称会提示;成功后刷新提交图。
  • 独立查询所选远程的标签状态,区分未推送、远程已存在、同名对象不同及状态未知。网络错误不会清空本地列表。
  • 删除确认可选择同时删除远程同名标签。远程状态未知时,必须先刷新才能勾选;远程对象不同会额外提示。同一仓库的所有 Worktree 共享标签。
  • 检出默认引导创建新分支;选择直接检出时明确提示游离 HEAD 风险。指向非提交对象的标签仍显示,但不提供检出。

执行与接口

新增 GitTags,复用 RepositoryTransport 和 runGit。本地使用参数数组执行 Git,SSH 使用现有安全参数引用。服务端写入沿用仓库操作互斥、超时及取消机制;读取标签设置 30 秒上限。

接口 用途
GET /repositories/:id/tags 本地标签列表
GET /repositories/:id/tags/remote?remote=origin 所选远程推送地址上的标签
POST /repositories/:id/tags 创建轻量/附注标签
POST /repositories/:id/tags/push 单个或全部标签推送
POST /repositories/:id/tags/delete 确认删除本地及可选远程同名标签
POST /repositories/:id/tags/checkout 基于标签创建分支或检出游离 HEAD

使用完整 refs/tags/... 引用,推送指定 refspec 并关闭隐式 follow-tags,避免影响同名分支或其他标签。远程状态以推送 URL 为准,而不是 fetch URL。

本地删除校验确认时的对象哈希,并用 update-ref 的旧对象条件删除;远程删除使用明确的 force-with-lease 条件。远程删除失败时保留本地标签。远程成功、本地失败时明确报告部分完成,不伪装回滚。检出保留 Git 对未提交修改的保护。

验收标准

  • 查看、搜索标签及其指向的提交,显示类型和附注。
  • 从 HEAD 与历史提交创建轻量/附注标签,提交图随即更新;校验重名与非法名称。
  • 本地与远程删除均需确认,结果与 git tag、git ls-remote --tags 一致。
  • 单个与全部标签推送可用,失败显示原因,同名分支不受影响。
  • 本地、Worktree、回环 SSH、SSH Worktree 的真实 Git 流程验证通过。
  • 创建新分支或明确确认游离 HEAD;保护可能被覆盖的未提交修改。

验证记录

以下记录均为 2026-10-05,macOS ARM64、Node.js 25.5.0,对应上述代码提交。SSH 验证使用本机回环 SSH 测试服务和临时仓库,不代表生产 SSH 主机或 Windows/Linux 原生桌面现场验收。

命令或场景 结果与证据
npm test -w web 240 项通过。开发中曾因组件直接引入 CSS 导致测试加载失败,调整到统一样式入口后重跑通过。
npm run test -w @alune/ssh-client 155 项通过,2 项仅在 Windows 执行的测试在当前平台跳过。
node --test packages/ssh-client/tests/tags.test.cjs 6 项通过,覆盖本地/Worktree/SSH/SSH Worktree,另验证重名、非法输入、历史提交、附注、多行中文、签名配置、同名分支、不同 push URL、远程冲突、旧确认哈希、离线读取、未提交修改及非提交对象。
npm test -w server -- --runInBand git/local-git.spec.ts git/git.controller.spec.ts 28 项通过,使用真实 Git、SQLite 和 HTTP;验证参数错误、确认条件、Worktree 共享标签及本地/远程删除。
npm run desktop:build 6 个构建任务通过;构建保留已有大 chunk 提示。未运行完整安装包现场验收。
桌面宽度浏览器操作 创建多行附注标签、搜索、单独推送、从标签创建分支、同时删除本地与远程标签均通过;用 Git 命令核对删除结果。
历史提交创建与校验 在历史提交创建轻量标签,提交图立即出现新引用;重名及非法名称提示通过。
390px 窄窗口与游离 HEAD 搜索、标签信息和操作按钮可见;确认提示明确,检出后 Git 状态为 HEAD (no branch)。
提交检查 git diff --check 与 commitlint 通过。

界面证据

变更前:分支页只有本地、远程分支操作,没有标签管理分组;未采集变更前截图。以下为本次实现和验收过程中的实际截图,宽窗口截图采集后去掉了标题旁仅统计分支的数字,最终标题见窄窗口截图。

Alune 标签搜索、附注与操作

Alune 390px 窄窗口标签管理

2026-10-06:同步 development 后的回归

合并提交:420dd6fd55bc7663da2494d58edc3d9b10487c46,同步 development / aaaa4bc45e4e6d404beb0dafd62b5f408d765692。解决 7 个文件中的类型导入、API、样式入口和操作提示冲突,保留标签管理、冲突处理与交互式变基功能。

本次验证环境为 macOS ARM64、Node.js 25.5.0;真实 Git、临时仓库与回环 SSH 服务。

命令或场景 结果与证据
npm run desktop:build 6 个构建任务通过;已有大 chunk 提示仍存在。
npm test -w web 248 项通过。
node --test packages/ssh-client/tests/tags.test.cjs packages/ssh-client/tests/conflict-resolution.test.cjs packages/ssh-client/tests/interactive-rebase.test.cjs 40 项通过,覆盖标签、冲突处理和交互式变基。
npm test -w server -- --runInBand git/local-git.spec.ts git/git.controller.spec.ts git/interactive-rebase.spec.ts 35 项通过。补充标签与变基保护的集成回归:暂停时允许列出标签,创建、删除、推送、创建分支与游离检出均返回 409;HEAD、工作区状态、标签引用不变,中止后恢复创建标签。
git diff --check、commitlint 通过,无未解决的冲突。

此次未重新执行浏览器现场验收;上方界面证据保留为 2026-10-05 的历史记录。Windows/Linux 原生桌面与生产 SSH 主机仍未现场验证。

风险、未决事项与回退

  • 多推送地址的远程暂不支持;需选择只有一个推送地址的远程。远程访问使用当前执行主机的 Git 认证配置。
  • Windows/Linux 原生桌面、生产 SSH 主机、签名标签创建未验证;签名和 Release 创建属于明确排除范围。
  • 本地与远程删除跨两次 Git 操作,无法保证跨仓库原子回滚;错误信息和刷新用于揭示部分完成。
  • 无数据库迁移。可回退代码提交恢复原入口;已创建、删除、推送或检出的 Git 状态不会随代码回退自动撤销。Wiki 与代码使用独立历史,应分别回退。

关联资料

Clone this wiki locally