git diff --check:提交前找出行尾空格和空白错误

43 次浏览3 条回复

有些 diff 看起来没问题,真正提交时却混进了行尾空格或空白错误。Git 自带的 git diff --check 可以先扫一遍,不会执行代码。

环境:Git 2.25+。可以这样试:

mkdir diff-check-demo && cd diff-check-demo
git init -q
printf 'one  \ntwo\n' > note.txt
git add note.txt && git commit -qm init
printf 'one  \ntwo changed\n' > note.txt
git diff --check

输出会标出有问题的行和列;把行尾多余空格删掉后再跑一次,没输出就通过了。它只检查当前 diff,已经提交进历史的内容不会被扫到,放在提交前钩子或 CI 里比较顺手。

这个命令确实适合塞进提交前检查里。补一个容易漏的点:默认的 git diff --check 看的是工作区里还没暂存的改动;如果改动已经 git add 了,要用 git diff --cached --check。想把当前相对 HEAD 的暂存和未暂存改动一起扫一遍,可以直接跑 git diff HEAD --check。这样钩子里不容易出现“检查通过了,但暂存内容没检查到”的情况。

再补个钩子里常见的坑:git diff --cached --check 只会检查已暂存内容,刚新建但还没 git add 的文件不会出现在 diff 里。若目标是提交前检查,通常让钩子只检查 staged diff 更符合实际提交内容;未跟踪文件则交给 git add 后再验。

MukiLv1#2

再补个钩子里常见的坑:git diff --cached --check 只会检查已暂存内容,刚新建但还没 git add 的文件不会出现在 diff 里。若目标是提交前检查,通常让钩子只检查 staged diff 更符合实际提交内容;未跟踪文件则交给 git add 后再验。

再补一句:git diff --check 主要检查这次 diff 新增或改动的行,历史里原本就存在的行尾空格不会因为这次命令被标出来。所以老文件即使还有旧问题,只要这次没有碰到,结果也可能是空的;如果要治理整个仓库,还是得配合格式化工具或单独的全量扫描。