Watch at Ease看见世界,读懂生活。

科技 · 实用指南

Git worktree 路径不见了?prune 前先 repair 或 lock

路径缺失可能是移动、临时离线或真正删除。先保留每个 worktree 的 HEAD 和 index,再分类并选择 repair、lock 或 prune。

原创流程图:清点缺失 Git worktree 并区分移动、临时离线和真正删除。
原创示意图: 原创技术图:先分类,再 repair、lock 或 prune。 Watch at Ease

linked worktree 的注册路径缺失是一个含义不明的状态,不等于可以删除元数据。相同现象可能来自目录移动、共享盘离线或工作树确实被废弃。

清理前先保存每个 worktree 的管理目录和仍可访问的文件。随后只走一条路径:移动就修复,间歇存储就锁定,只有确认过时才 prune。

1. 任何清理前冻结证据

从健康工作树运行 git worktree list --porcelain -z,保存 path、HEAD、branch、locked 和 prunable。解析公共 Git 目录与受影响的管理目录,记录 gitdir、HEAD 和 index 哈希,并在 Git 静止时复制该目录。

同时保存可访问的工作目录与未跟踪文件。分支尖端属于共享历史,但未暂存内容只在工作目录,暂存状态由该工作树的 index 表示。dry-run 不是安全证明。

2. 给缺失路径分类

目录在别处就按“已移动”处理;位于移动设备、网络共享或可消失挂载上就按“临时离线”处理;只有负责人确认目录及未提交工作不再需要,才判定“真正删除”。

不要把 prune 当发现工具。Git 会删除路径缺失条目的管理信息,错误的绝对反向指针也可能让活工作树在容器/主机边界上看似陈旧。

3. 修复移动路径,锁定间歇路径

对移动的 linked worktree,向 repair 传入新路径,再比较新的 gitdir、HEAD 与分支。

对间歇存储,在仍可访问时执行带 reason 的 lock。Git 的 locked 文件会阻止自动和手动 prune;路径恢复且普通 Git 命令成功后再解锁。

4. 用暂存状态验收修复

重新运行 status 与 git diff --cached,核对分支或 detached HEAD,并读取一个普通 Git 对象。验收前不要覆盖证据副本。

Git 2.51.1 夹具中,移动目录使旧注册被标记 prunable,dry-run 提议删除;repair 保留了已暂存的新文件。预先 lock 后模拟离线,dry-run 不再列出删除候选。

5. 只 prune 已证实的陈旧注册

确认工作树真正过时后,先用 --dry-run --verbose,将每个候选与证据账对应,再执行清理。路径仍在时优先 worktree remove。

若已经 prune,停止继续清理并保存工作文件、共享对象库与 reflog。fsck 可列出可达、不可达和悬空对象,但不是自动撤销按钮。

原创状态图:区分工作文件、共享 Git 历史以及每个 worktree 的 HEAD、index、gitdir 和 lock。
原创示意图: 原创技术图:prune 删除的是每工作树管理状态,各类数据的存活边界不同。 Watch at Ease