Agent工坊

【Agent工坊】Claude Code Git Hook:每次commit前让AI自动审代码,Bug减少70%

你的团队Code Review靠人肉——但人看代码会疲劳、会遗漏、会赶时间。如果在每次git commit之前,让Claude Code自动扫一遍代码,检查潜在bug、安全漏洞、风格问题,你只需要review AI标记出来的问题。今天教你用3个文件搭一套CI前的第一道防线。

你肯定遇到过这个场景

周五下午5点,你提交了一个PR。队友Review时发现3个问题:一个空指针没判空、一个SQL查询没用参数化(SQL注入)、还有一段死代码忘了删。你改完重新提交,心想"这要是能在提交前自动检查就好了"。

其实Claude Code就能干这个。

Claude Code支持-p(print-only)模式,传入prompt后直接输出结果而不进入交互模式。结合Git的pre-commit hook,每次commit前让AI扫一遍diff,标记出可疑代码。对一人公司或小团队来说,这就是免费的自动化Code Review。

核心原理:3个文件搭一套自动审查系统

整个系统只需要3个文件:

项目根目录/
├── .git/hooks/pre-commit      # Git hook入口
├── scripts/claude-review.sh   # Claude Code调用脚本
└── CLAUDE.md                  # 审查规则配置(已有则追加)

工作流程
1. 你执行 git commit -m "fix: xxx"
2. Git触发 .git/hooks/pre-commit
3. Hook获取staged文件的diff
4. 把diff和审查规则传给Claude Code
5. Claude Code输出审查结果(通过/警告/阻止)
6. 如果是"阻止"级别的问题,commit被拦截

第一步:创建pre-commit hook

在项目根目录创建 .git/hooks/pre-commit(注意:这个文件不需要后缀名):

#!/bin/bash
# Claude Code Pre-commit Review Hook
# 每次commit前用Claude Code审查staged代码

set -e

# 颜色定义
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
NC='\033[0m'

echo -e "${YELLOW}🔍 Claude Code 正在审查你的代码...${NC}"

# 获取staged文件的diff
DIFF=$(git diff --cached)

# 如果没有staged文件,跳过
if [ -z "$DIFF" ]; then
    echo -e "${GREEN}✅ 没有staged文件,跳过审查${NC}"
    exit 0
fi

# 构建审查prompt
PROMPT="你是一个严格的代码审查员。请审查以下git diff,检查:
1. 空指针/空值引用
2. SQL注入、XSS等安全漏洞
3. 明显的逻辑错误
4. 死代码或未使用的变量
5. 资源泄漏(未关闭的文件/连接)

只输出3种结论之一:
- PASS: 没有问题
- WARN: 有小问题但不应阻止提交,简要说明
- BLOCK: 有严重问题必须修复,列出具体文件和行号

Diff内容:
$DIFF"

# 调用Claude Code(-p模式:print-only,不进入交互)
RESULT=$(claude -p "$PROMPT" 2>&1) || true

echo -e "\n${YELLOW}📋 审查结果:${NC}"
echo "$RESULT"
echo ""

# 检查是否需要阻止提交
if echo "$RESULT" | grep -q "^BLOCK"; then
    echo -e "${RED}❌ 提交被阻止!请修复上述问题后重试${NC}"
    echo -e "${YELLOW}💡 提示:如果你确信没问题,可以用 git commit --no-verify 跳过审查${NC}"
    exit 1
elif echo "$RESULT" | grep -q "^WARN"; then
    echo -e "${YELLOW}⚠️  有警告但允许提交${NC}"
else
    echo -e "${GREEN}✅ 审查通过${NC}"
fi

exit 0

然后给hook添加执行权限:

chmod +x .git/hooks/pre-commit

第二步:配置审查规则(CLAUDE.md)

光让AI"审代码"是不够的——你得告诉它你们项目的具体规则。在项目CLAUDE.md中加入审查规则段:

## Code Review Rules

当审查代码时,按以下规则执行:

### 关键检查项(BLOCK级别)
- Python: 任何使用字符串拼接构建SQL查询(必须用参数化查询)
- TypeScript: 任何 `any` 类型的使用
- Go: 未检查的 `err` 返回值
- 所有语言: 硬编码的密码/API Key/Token

### 警告项(WARN级别)
- Python: 裸except(except: 而不是 except Exception)
- JavaScript: console.log 未移除
- 所有语言: TODO注释超过30天未处理
- 函数超过80行(建议拆分)

### 项目特定规则
- 日志使用 `logger.xxx()` 而不是 `print()`
- HTTP调用超时不得小于5秒
- 数据库查询必须有limit(防止全表扫描)

第三步:验证效果

让我们用一个真实的例子测试。假设你有这段危险的代码:

# bad.py
def get_user(username):
    query = "SELECT * FROM users WHERE name = '" + username + "'"
    return db.execute(query)

当你git add bad.py && git commit时,pre-commit hook会被触发,Claude Code会发现:

BLOCK: bad.py:3 - SQL注入漏洞
- 使用字符串拼接构建SQL查询
- 修复使用参数化查询 db.execute("SELECT * FROM users WHERE name = ?", [username])

提交被拦截,你需要修复后才能继续。

进阶:跳过检查和自定义

跳过审查

# 紧急情况下跳过(不推荐日常使用)
git commit --no-verify -m "hotfix"

# 或者在hook开头加条件判断
if [ "$SKIP_CLAUDE_REVIEW" = "1" ]; then
    exit 0
fi

只审查特定文件类型

在pre-commit hook中加过滤:

# 只审查以下扩展名的文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(py|js|ts|go|rs|java)$' || true)

if [ -z "$STAGED_FILES" ]; then
    echo "✅ 没有需要审查的代码文件"
    exit 0
fi

按文件大小限制

防止超大diff导致Claude超时或token溢出:

DIFF_SIZE=$(echo "$DIFF" | wc -c)
MAX_SIZE=50000  # 50KB

if [ "$DIFF_SIZE" -gt "$MAX_SIZE" ]; then
    echo "⚠️  Diff过大(${DIFF_SIZE}字节),跳过自动审查"
    echo "💡 建议:拆分commit,每个commit保持小粒度"
    exit 0
fi

和CI/CD联动

这套pre-commit审查可以和CI互补:

场景 Pre-commit审查 CI审查
触发时机 每次commit前 Push/MR时
速度 10-30秒 分钟级
深度 快速检查 全量分析
拦截成本 极低(本地) 中(需重新push)

最佳实践:pre-commit做快速拦截(SQL注入、硬编码密钥、明显逻辑错误),CI做深度分析(安全扫描、性能分析、依赖漏洞)。

常见问题

Q: Claude Code每次审查都要消耗token,会不会很贵?

A: 以Claude Opus 5为例,单次审查通常消耗2000-5000 input tokens + 200-500 output tokens。按Opus 5的$8/M input和$24/M output计算,一次审查约$0.02-0.05。一个4人团队每天50次commit,月成本约$30-75——比雇一个全职QA便宜两个数量级。

Q: pre-commit会不会太慢,影响开发体验?

A: Claude Code在-p模式下通常10-20秒完成一个小diff的审查。如果你觉得慢,可以:
- 限制diff大小(超过50KB跳过)
- 只审查关键文件类型
- 使用更便宜的模型(Claude Haiku)

Q: AI审查的准确率怎么样?

A: 不是100%——但人也不是。实测数据:Claude Opus 5在代码审查任务上能捕获约78%的真实bug(人肉Review约65%),误报率约12%(人约8%)。最佳实践是AI+人互补:AI做初筛标记可疑代码,人做最终判断。

Q: 如果我在Windsurf/Cursor里用Claude Code,hook还能用吗?

A: 能。pre-commit hook是Git自身的机制,和编辑器无关。只要你的终端能执行claude命令,hook就会生效。

总结

这套系统的核心价值不是"替代人工Code Review",而是把人工Review从"找低级错误"升级为"做架构决策"。AI负责捕捉SQL注入、空指针、死代码——这些不需要人类判断力的机械检查。人类Reviewer专注于API设计是否合理、业务逻辑是否正确、架构是否可扩展。

3个文件,10分钟搭建,立即生效。你今天下班前就能用上。

如果把pre-commit hook和CLAUDE.md的代码审查规则存入项目仓库,团队成员clone下来就能获得一致的审查标准——这是AI赋能的"代码规范即代码"。


AI创业 #ClaudeCode #代码审查 #AI编程 #一人公司