Codex 修改的文件名含空格和换行,自动验收清单怎样不拆错
验收清单少一项,不一定是 Git 没列出来,也可能是解析器把文件名里的换行当成了记录边界。Codex 改动范围进入脚本处理时,路径是数据,不能沿用人看终端的逐行阅读方式。应使用 Git 提供的 NUL 分隔输出,并把安全显示形式与真实路径分开。
四个名字验证记录边界
附件二进制夹具包含 normal.txt、space name.txt、含制表符的名字以及含换行的名字。每个路径以 NUL 结束。检查器先按字节零拆分,确认尾部终止符,再逐个严格解码。四个名字必须逐字相同地还原;使用 splitlines() 的反例会把最后一个名字拆开,并可能把制表符误当列边界。
夹具是依据 Git 的 -z 输出合同构造的跨平台数据,不在 Windows 文件系统上实际创建含换行的文件。因此这里证明的是清单消费者能保存这些路径,不能声称所有宿主系统都允许建立同样的名字。遇到非 UTF-8 名称,本文演示解析器明确失败,真实项目可以另定保留原始字节的编码合同。
字段结构由所选命令决定
git diff --name-only -z 与 --name-status -z 的字段结构不同。前者只列名字,后者还含状态,重命名会带旧新两个路径。不能把一种命令的解析器直接用于另一种。机器报告需保存生成命令、比较基线和原始输出摘要,这样才能确认每个字节字段代表什么。
空输出意味着没有记录,应得到空数组。非空输出末尾缺少 NUL,则按本文合同视为截断,不把残余片段自动当成完整文件名。重命名所需第二个路径丢失也同样拒收。拒绝比猜测更有价值,因为下游若把半个路径用于暂存或删除,会把一个读取错误变成实际变更。
显示层不能反过来改原数据
JSON 可以把换行显示为转义序列,便于人工看清;这不意味着路径里真的有反斜杠和字母 n。报告同时保存原值和可读展示,后续文件操作只使用原值。不要复制一行带引号的展示文字去拼接 shell 命令,参数边界应由调用接口明确表达。
失败信息也必须安全显示,不能直接把含控制字符的路径打印成多行,让日志看起来像新增了几条记录。对外共享清单前还应审核路径是否暴露内部项目名称,但脱敏展示不能用于真实文件查找。
这份检查与“只提交本次任务文件”相互配合:前者保证路径集合没有在解析阶段损坏,后者保证集合的任务归属。即使四种路径都正确读取,仍然需要审查具体变化块与用户已有修改。本文不会运行暂存、移动或删除操作,二进制夹具可以独立重复核验。
配套文件与依据
本文的合成输入和参考结果可下载独立样本 a008.json,离线检查器 a008.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a008.py。 同篇运行还需要:a008-nul-path-fixtures.bin,请一并下载。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。