如何让Git pre-commit hook仅检查暂存代码块中的禁用字符串?
修改Git pre-commit Hook脚本(仅检查暂存代码块)
核心思路
要解决这个问题,关键是只针对暂存区和HEAD之间的差异片段做检查,而不是扫描整个文件。通过git diff命令可以精准提取出用户本次要提交的代码变更,再对这些变更内容做模式匹配即可。
兼容dash的完整脚本
#!/bin/dash # 定义需要拦截的字符串模式 FORBIDDEN_PATTERN='// TODO foo bar baz' # 遍历所有暂存的文件 git diff --cached --name-only | while read -r file; do # 跳过已被删除的文件 [ -f "$file" ] || continue # 提取该文件的暂存变更行,检查是否包含禁用字符串 git diff --cached --diff-filter=AC --unified=0 "$file" | \ grep -E '^\+' | \ grep -v '^\+\+\+' | \ sed 's/^\+//' | \ if grep -q "$FORBIDDEN_PATTERN"; then echo "错误:暂存文件 '$file' 包含禁用字符串:$FORBIDDEN_PATTERN" exit 1 fi done # 所有检查通过,允许提交 exit 0
脚本关键逻辑说明
git diff --cached --name-only:列出所有被暂存的文件git diff --cached --diff-filter=AC --unified=0 "$file":仅提取该文件中新增/修改的代码片段,--unified=0去掉上下文,只保留变更行grep -E '^\+':筛选出所有新增的代码行(行首以+标记)grep -v '^\+\+\+':过滤掉文件头行(比如+++ b/src/utils.js这类非代码行)sed 's/^\+//':去掉行首的+标记,还原代码原本的内容- 最后通过
grep -q检查变更行中是否存在禁用字符串,一旦匹配到就报错并终止提交流程
使用步骤
- 将上述脚本内容复制到项目的
.git/hooks/pre-commit文件中 - 给脚本添加执行权限:
chmod +x .git/hooks/pre-commit
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

