版本:Qoder 桌面版 0.3.3(macOS,Apple Silicon)
现象
在一个 git 仓库中,用 worktree 模式(从当前工作树创建新工作区)新建会话,发送第一条消息后会话立即变为 error、无任何回复,提示:
Git 命令输出超过限制,请缩小操作范围后重试。
日志错误:ChatSessionWorktreeCreationError,errorCode: OUTPUT_LIMIT,失败阶段 stage: git_creation(约 4 秒后失败)。同仓库下多个会话 100% 复现;「当前工作区」模式正常。
复现条件
- 仓库包含大量被 .gitignore 忽略的文件(例如多个 node_modules,合计约 27 万个文件);
- 仓库根目录存在
.worktreeinclude文件(用于声明需要复制进新 worktree 的被忽略文件,如本地环境配置文件); - worktree 模式新建会话并发送任意消息。
原因定位(分析应用包 app.asar 内的实现)
worktree 创建时「复制 .worktreeinclude 声明文件」这一步的实现是:
- 先执行
git ls-files --others --ignored --exclude-standard -z列出仓库全部被忽略文件; - 再执行
git ls-files --others --ignored --exclude-from=.worktreeinclude -z列出 include 声明的文件; - 两者求交集后复制。
这两条 git 命令的 maxBufferBytes 上限是 16MB(应用内常量 V8e = 16 * 1024 * 1024)。第 1 步在此类仓库中输出实测约 38MB,超出上限后 Node 抛 ERR_CHILD_PROCESS_STDIO_MAXBUFFER,被映射为 OUTPUT_LIMIT,导致整个会话创建失败。
而实际需要的只是第 2 步的结果(本例中仅 1 个文件),无需先全量枚举被忽略文件。
期望
- 不要全量枚举被忽略文件(可直接用
--exclude-from=.worktreeinclude,或对每个模式用 check-ignore 判断,或流式处理/提高上限); - 至少该步骤失败不应导致整个会话无法启动。
影响:node_modules 较大的仓库中,worktree 模式 100% 不可用。