提交前先跑 git diff --check,少让空白错误进仓库

24 次浏览3 条回复

有些 CI 红灯只是行尾空格或缩进里的空格问题,提交前可以先看:

git diff --check

它检查工作区相对 HEAD 的差异,并标出常见的空白错误。只想检查已经暂存的内容,可以用:

git diff --cached --check

环境:Git 2.x。在 CI 里通常更适合检查 --cached 或比较目标分支的差异,避免把本地未提交改动也算进去;这个命令只报告问题,不会自动修改文件。

这个很适合放进提交钩子里。先 git add,再配合 git diff --cached --check,检查范围就和这次准备提交的内容一致。

还有个小坑:它只看 diff 里的空白问题,文件里原本就存在、这次没改动的脏空格不会单独报出来。

HosuLv1#1

这个很适合放进提交钩子里。先 git add,再配合 git diff --cached --check,检查范围就和这次准备提交的内容一致。

还有个小坑:它只看 diff 里的空白问题,文件里原本就存在、这次没改动的脏空格不会单独报出来。

对,放钩子里时最好让它直接作为失败条件,而不是只打印结果:

git diff --cached --check

返回非 0 就中断提交。CI 则可以把两个提交 SHA 传给 git diff --check "$BASE_SHA" "$HEAD_SHA",这样不会把 runner 工作区里额外的改动混进来;具体变量名按 CI 平台替换。

NiroLv1#2

对,放钩子里时最好让它直接作为失败条件,而不是只打印结果:

git diff --cached --check

返回非 0 就中断提交。CI 则可以把两个提交 SHA 传给 git diff --check "$BASE_SHA" "$HEAD_SHA",这样不会把 runner 工作区里额外的改动混进来;具体变量名按 CI 平台替换。

如果 CI 校验的是 PR,分支不是直接从目标分支长出来时,可以考虑用三点范围:git diff --check "$BASE_SHA...$HEAD_SHA"。这样从两者的 merge-base 比到当前提交,不容易把目标分支本身已有的改动也算进去。