Files
CraftKit/plugins/git/skills/integrate/references/worktree-lifecycle.md
T

104 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Worktree 生命周期
## 适用范围
本规则管理预集成独立 worktree 从创建到安全移除的完整生命周期。主工作区不干净、用户要求不影响当前 checkout、当前分支被 IDE/服务/测试占用、需要复用旧预集成分支或预计发生冲突时,必须使用独立 worktree。
Worktree 只隔离工作目录;所有 worktree 共享仓库对象和本地分支引用。同一个本地分支不能同时被两个 worktree 签出。
## 生命周期状态
- `planned`:已确认仓库、分支、基准和绝对路径,尚未创建。
- `active`:worktree 已创建,开发、合并或验证正在进行。
- `delivery-ready`:差异和验证完成,等待本地交付确认或发布。
- `cleanup-ready`:本地交付已确认,或用户要求的发布已经完成,可以清理。
- `cleanup-blocked`:存在未提交内容、进行中的 Git 操作、引用风险或需要保留的现场。
- `removed`:额外 worktree 已移除,分支和提交仍存在。
## 创建和占用记录
创建前确认目标绝对路径不存在、目标分支未被其他 worktree 占用、基准引用可解析并记录完整哈希。分支名可能包含中文时始终加引号,不使用 `$HOME`、`$home` 或 `$CODEX_HOME` 作为任务变量。
创建后记录并报告:
- 主仓库绝对路径;
- worktree 绝对路径;
- worktree 当前分支和 HEAD;
- 主工作区当前分支、HEAD 和未提交状态;
- 该分支已被额外 worktree 占用,主工作区不能同时签出;
- 后续操作目录和生命周期结束后的清理义务。
## 新建或复用预集成
旧预集成已经合入目标分支时,默认新建增量预集成分支,使交付历史易于审计。只有用户明确选择复用,并且旧预集成可解析、上次源分支基线已包含、旧预集成与目标分支关系已查清、最终 `<target>...HEAD` 可收敛为本次需求文件时,才能继续复用。
历史中存在直接合入错误版本分支、无关需求或异常大量文件时,不得只因引用可解析就复用。复用时推荐先合入源分支最新增量,再合入最新目标分支;项目规范规定其他拓扑时以项目规范为准。
## 交付范围和结束条件
Merge 输出出现大量目标分支文件不等于 MR/PR 包含这些文件。必须检查:
```text
git diff --check "<target>...HEAD"
git diff --stat "<target>...HEAD"
git diff --name-status "<target>...HEAD"
git log --oneline "<target>..HEAD"
git log --first-parent --oneline -20
```
只有同时满足以下条件,生命周期才可进入 `cleanup-ready`:
- 本次开发或预集成已经完成;
- 用户要求的验证已经完成;
- 用户确认仅本地交付,或用户要求的发布已经完成;
- worktree 没有未提交或未跟踪文件;
- 没有进行中的 merge、rebase、cherry-pick 或 revert;
- 当前 HEAD 已被预期本地分支引用;
- 用户不再要求保留现场。
用户要求保留现场时标记为 `delivery-ready`,明确说明生命周期尚未结束以及分支仍被该 worktree 占用。
## 清理门禁
移除前展示主仓库和 worktree 的准确绝对路径、分支、HEAD、状态、分支引用验证和唯一清理命令。检查至少包括:
```text
git -C "<worktree>" status --porcelain
git -C "<worktree>" branch --show-current
git -C "<worktree>" rev-parse HEAD
git -C "<worktree>" rev-parse -q --verify MERGE_HEAD
git -C "<main-repository>" worktree list --porcelain
git -C "<main-repository>" branch --contains "<head-sha>"
```
`MERGE_HEAD` 不存在是预期结果。还要依据 Git 状态确认不存在 rebase、cherry-pick 或 revert;任一操作未结束时标记为 `cleanup-blocked`。
用户确认准确清理信息后执行:
```text
git -C "<main-repository>" worktree remove "<absolute-worktree-path>"
```
不得直接删除目录,不得默认使用 `--force`,不得为解除占用而删除或重置分支,也不得批量清理其他 worktree。
## 清理后验证
```text
Test-Path -LiteralPath "<absolute-worktree-path>"
git -C "<main-repository>" rev-parse --verify "<branch>"
git -C "<main-repository>" worktree list --porcelain
git -C "<main-repository>" status --short --branch
```
只有目录不存在、worktree 列表已释放占用、分支和提交仍存在、主工作区原有状态未变化时,才能标记为 `removed`。
## 分支已被占用
出现以下错误表示目标分支仍由额外 worktree 签出:
```text
fatal: '<branch>' is already used by worktree at '<path>'
```
继续在错误给出的 worktree 中操作,或者在其生命周期结束并通过清理门禁后移除。不得强制 checkout、直接删除目录或删除分支绕过 Git 的占用保护。