Skip to content
FunCoding

Search

Search docs, Skills and MCP

临时 Worktree 清理规则

了解 30 天扫描、忽略文件保护、构建产物豁免及排障。

This page has not been translated into English yet. The original Chinese version is shown below.

每次 CLI 启动会检查崩溃等留下的临时 agent worktree。清理采用保守条件,但不是所有 git-ignored 文件都被永久保留。

成为候选的条件

只有 slug 恰好为 agent-<7hex> 且目录 mtime 超过 30 天才考虑。普通命名 worktree 不扫描;用户手工命名成同样形状也无法区分,因此不应给需要长期保留的工作使用该模式。

读取 Git 状态出错、存在未提交内容或存在不可从远端到达的提交时跳过。这里的 stale sweep 提交判定与显式 remove 的“其他本地/远端引用”条件不同,不应混为一条。

未提交与忽略文件

扫描使用带 --untracked-files=normal --ignored=matching 的 status,普通 .env、.qwen/pr-drafts 等被忽略内容也能保住 checkout。

以下内容可被视为可丢弃:

  • 根层第一段是 node_modules、dist、coverage 的 ignored 条目,包括其中单独列出的文件。
  • 更深层同名 ignored 目录,只有 Git 把条目折叠到该目录自身时才豁免;规则仅匹配其内部内容而逐项列出时,不等价。
  • symlink 本身,删除只解除链接;折叠目录必须非空且全部成员都是链接,旁边有真实文件或空目录会保留。
  • daemon 的 .qwen-session 标记,只有 untracked/ignored 时豁免;tracked 标记的修改仍当作工作保留。

因此 root dist/archive.zip 即使有需要的产物也可能随候选清理;而 untracked 的 ?? dist/ 不享受 ignored 豁免。嵌套名为 coverage 的普通文件也不是构建目录豁免。

Git 因特殊字符而引用的路径不继续解析,按有工作保留。

排障

先用 git worktree list 检查真实 checkout,再核对分支、目录内容和会话所有权。调试日志中的 cleanupStaleAgentWorktrees: keeping 说明为什么保留,worktreeHasWork: waiving 说明哪些条目触发了豁免。

不要因为目录超过 30 天就假定应删除;mtime 条件只是候选入口,后续内容与提交检查仍必须通过。显式移除见生命周期。