应使用git diff --cached --name-only --diff-filter=ACM | grep '\.html$'提取本次变动的HTML文件,再传给npx html-validate校验;避免全量扫描、误匹配及空结果失败,且须锁定本地安装版本确保规则一致。

pre-commit 怎么只检查本次提交的 HTML 文件
直接在 .git/hooks/pre-commit 里写 npx html-validate *.html 是错的——它会扫全量文件,哪怕你只改了一个 README.md,也会卡住几秒并可能报旧文件的错。
必须用 git diff --cached --name-only --diff-filter=ACM 提取本次暂存区里真正变动的 HTML 文件路径,再喂给 html-validate。关键点有三个:
-
--diff-filter=ACM确保只捕获新增(A)、修改(M)、重命名(R)的文件,跳过已删除(D)或未变更的 -
grep '\.html$'后缀过滤要加$锚定,否则会误匹配myhtml.js这类名字 - 结果为空时必须
exit 0,否则非 HTML 提交也会失败
示例片段:
HTML_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.html$') if [ -z "$HTML_FILES" ]; then exit 0; fi npx html-validate --config .htmlvalidate.json $HTML_FILES
为什么选 html-validate 而不是 tidy 或 htmlhint
tidy 和 htmlhint 在本地跑得动,但它们报错不可操作:比如 tidy 说 “line 42 column 17 - Warning: missing </div>”,却不告诉你该补在哪、要不要嵌套;htmlhint 规则老旧,对 aria-label、role="region" 这类现代可访问性属性基本不校验。
立即学习“前端免费学习笔记(深入)”;
html-validate 的优势是“报错即修复线索”:
- 错误带精确行号 + 列号 + 规则 ID(如
no-duplicate-id),方便搜文档 - 支持
custom-elements配置,能识别<my-button>这类自定义标签而不报错 - 输出可转 JSON,后续可对接 IDE 插件或生成报告,不是纯人肉读日志
注意:别用 npm install -g html-validate,全局安装版本难统一;锁定 "html-validate": "7.12.0" 在 package.json 里,确保团队每人跑的规则一致。
监控一个或多个 GitCode 仓库的 PR,通过 OpenClaw Gateway 自动执行 AI 审查,发布 PR 评论,并发送钉钉和企业微信通知。
commit-msg 钩子怎么判断是否要校验提交信息
不是所有提交都要 enforce feat(html): 前缀——只有当本次提交确实含 HTML 变更时才触发校验,否则开发者会被逼疯。
判断逻辑必须两步走:
- 先用
git diff --cached --name-only | grep '\.html$' > /dev/null检查是否有 HTML 文件变动 - 命中后,再读取
$1(commit-msg 传入的临时消息文件路径),用grep -q '^(feat\|fix\|refactor\|docs)(html):'匹配前缀
别写 grep -q 'html\|template\|jsx' 这种模糊匹配——template 可能指 JS 模板字符串,jsx 根本不该归到 HTML 钩子里管。聚焦变更类型,而非文件名关键词。
pre-push 才适合验证构建产物里的 HTML
pre-commit 只能看到源码,但真实问题常出在构建后:webpack 插件删了 <script>、Vite 的 import() 动态路径解析失败、CSS-in-JS 注入丢失 class——这些源码里根本看不出来。
pre-push 是唯一能本地触发构建并检查产物的时机,但必须加保护:
- 先
[ -d dist ] || { echo "❌ dist not built"; exit 1; },避免每次 push 都跑一遍npm run build - 构建完立刻用
npx html-validate dist/index.html,不要等 CI —— CI 失败再修,上下文早断了 - 别在
pre-push里调prettier --write改dist/下文件——那是构建产物,改了也没意义,还污染 git status
容易被忽略的是:不同构建工具输出路径可能不是 dist/,比如 Next.js 默认是 .next/,校验前得先确认实际产物位置。


















