你的团队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赋能的"代码规范即代码"。
