You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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检查变更行中是否存在禁用字符串,一旦匹配到就报错并终止提交流程

使用步骤

  1. 将上述脚本内容复制到项目的.git/hooks/pre-commit文件中
  2. 给脚本添加执行权限:chmod +x .git/hooks/pre-commit

内容的提问来源于stack exchange,提问作者lonix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:17:41