解决 Conductor 创建 Git Worktree 时报错 "already exists" 的问题

TLDR

环境:macOS 15.7.3, Conductor v0.31.0
问题:Conductor 创建 worktree 时报 "already exists" 错误
原因:Conductor 的 release build 开启了 LLVM 代码覆盖率,会在 workspace 目录生成 default.profraw 文件,导致 git worktree add 失败
解决方案:使用 LLVM_PROFILE_FILE=/dev/null open -a Conductor 启动
根本修复:等待 Conductor 官方在 release build 中关闭代码覆盖率

-------

问题现象

最近在使用 Conductor 时,每次新建 git worktree 都会遇到这样的错误:
Preparing worktree (new branch 'versun/ottawa')
fatal: '/Users/versun/conductor/workspaces/zhijian/ottawa' already exists
奇怪的是,虽然报错了,但 worktree 实际上已经创建成功,分支也正常建立了。这个错误信息让人困惑——到底成功了还是失败了?

排查过程

检查目录状态
首先检查报错的目录:
ls -la /Users/versun/conductor/workspaces/zhijian/ottawa/
输出:
total 0
drwxr-xr-x@ 3 versun  staff  96 Jan 17 07:10 .
drwxr-xr-x@ 3 versun  staff  96 Jan 17 07:10 ..
-rw-r--r--@ 1 versun  staff   0 Jan 17 07:10 default.profraw
发现目录里有一个 default.profraw 文件,这是 LLVM 代码覆盖率工具生成的文件。当程序使用 -fprofile-instr-generate(C/C++)或 -C instrument-coverage(Rust)编译时,运行时会自动在当前工作目录生成这个文件,用于收集代码覆盖率数据。

验证猜想

搜索系统中所有的 default.profraw 文件:
find ~/conductor -name "default.profraw"
输出:
/Users/versun/conductor/workspaces/Rables/semarang/default.profraw
/Users/versun/conductor/workspaces/Rables/chennai/default.profraw
/Users/versun/conductor/workspaces/Rables/quito/default.profraw
/Users/versun/conductor/workspaces/zhijian/ottawa/default.profraw
... (几乎所有 workspace 目录都有)
果然,几乎所有 Conductor 创建的 workspace 目录都包含这个文件。

根本原因

问题的根本原因是:
  1. Conductor 先创建 workspace 目录
  2. Conductor 进程在该目录下生成 default.profraw 文件(因为 release build 开启了代码覆盖率)
  3. 然后执行 git worktree add 命令
而 git worktree add 要求目标目录必须为空或不存在。由于 default.profraw 的存在,目录非空,git 就会报错:
fatal: '...' already exists
但实际上,git 在报错前已经成功创建了分支,所以会出现"报错但实际成功"的奇怪现象。
复现验证
可以用以下命令复现这个问题:
# 创建一个非空目录
mkdir -p /tmp/test-worktree
touch /tmp/test-worktree/some-file.txt
# 尝试在非空目录创建 worktree
cd your-git-repo
git worktree add -b test-branch /tmp/test-worktree main
输出:
Preparing worktree (new branch 'test-branch')
fatal: '/tmp/test-worktree' already exists

临时解决方案

在启动 Conductor 时,设置环境变量 LLVM_PROFILE_FILE=/dev/null 来禁止生成 profraw 文件:
LLVM_PROFILE_FILE=/dev/null open -a Conductor
或者创建一个 shell alias:
# 添加到 ~/.zshrc 或 ~/.bashrc
alias conductor='LLVM_PROFILE_FILE=/dev/null open -a Conductor'
之后使用 conductor 命令启动即可。
验证修复
使用上述方法启动 Conductor 后,新建 worktree 不再报错,目录也不会再生成 default.profraw 文件。

如果你也遇到了这个问题,可以尝试上述临时解决方案。