Commit 049686a
这道门禁自己的报错文案写着它拦的是什么:一个裸 NUL 让 grep/ripgrep 把整个
文件当成二进制、静默返回零匹配。那是 grep 的行为,与文件是什么语言无关 ——
但扫描面此前是一份 JS/TS 扩展名清单,范围(用途)与理由(载体)对不上。
代价是 .claude/ 下的全部 markdown 同时落在三道门禁之外。#4890 就是这么暴露
的:PR #4885 要写的规则正是「不要写裸 NUL」,而写的过程中一个真的裸 NUL 落进
了 .claude/skills/pm-dispatch/SKILL.md,这道门禁报 OK。
改为扫描所有被 git 跟踪的文本文件。二进制判据是内容判断而非扩展名清单:
非常规文件(symlink / gitlink)跳过;UTF-16/32 BOM 开头跳过(那种编码里 NUL
是结构性的);其余先剔除 NUL 字节、再整文件按 UTF-8 严格解码,解不通才算
二进制。先剔除 NUL 是为了打破「有 NUL 所以是二进制所以不查 NUL」这个 git 掉
进去的循环;整文件解码而非只看前缀,是因为 git 只嗅前 8000 字节正是本文案里
记着的盲区。
同时按仓内惯例把 --self-test 接进 check:nul-bytes 脚本,自检在临时 git 仓库
里跑真实的 scan() 路径。
Claude-Session: https://claude.ai/code/session_018iARDqtrhQgz6fVHDeDkbQ
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 07ce845 commit 049686a
3 files changed
Lines changed: 314 additions & 48 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
| 35 | + | |
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| |||
0 commit comments