这个 Hook 能阻止 Claude Code 运行危险的 Git 命令
学习如何使用 PreToolUse Hook 阻止 Claude Code 中的危险 Git 命令,通过 Git 护栏避免意外数据丢失。
本页目录
我制作了一个技能,可以彻底阻止 Claude Code 运行危险的 Git 命令。通过以下方式添加: npx skills add:
npx skills add mattpocock/skills/skills/misc/git-guardrails-claude-code
Claude 会引导你完成设置:选择只为当前项目安装,或全局安装到所有项目,然后自定义要阻止的 Git 命令。
为什么需要这个技能
Docker Sandbox 的背景
最近我一直在尝试 Ralph 风格工作流 ,目前发现让 Claude 自主运行最强大的方式是使用 Docker Sandbox.
它允许 Claude Code 以 YOLO 模式运行,不必为每条命令请求许可;同时又通过在 microVM 中运行来保护系统。你可以让智能体无人值守地工作,每隔几分钟查看一次。
代价是:Docker 沙箱 不会限制 what Claude 可以运行哪些命令,它只是隔离命令 where 的运行位置。
Docker Sandbox 留下的缺口
问题在于:Git 历史也位于这个被沙箱化的文件夹中。
Docker Sandbox 能阻止 Claude 访问项目目录之外的位置,却无法阻止它在 within 该目录中运行破坏性 Git 命令。只需一条 git reset --hard or git push --force 就可能抹掉数周工作。
这个技能用一道硬护栏填补了缺口,阻止 Claude Code 运行危险命令。
想继续深入: 加入“面向真正工程师的 AI 编码”候补名单
会阻止哪些命令
该技能默认阻止以下危险模式:
git push(包括所有变体,例如--force)git reset --hardgit clean -f/git clean -fdgit branch -Dgit checkout ./git restore .
这些并非“永远不允许”的规则,而是“默认安全”的规则。
安装时可以自定义阻止模式,也可以随时编辑。如果工作流确实需要 Claude 推送到远程 PR,可以放行。
工作原理:Hook 系统
该技能使用一个 PreToolUse Hook,在 Claude 执行 Bash 命令前进行拦截。
下面是过滤脚本:
#!/bin/bashINPUT=$(cat)COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')DANGEROUS_PATTERNS=("git push""git reset --hard""git clean -fd""git clean -f""git branch -D""git checkout \.""git restore \.""push --force""reset --hard")for pattern in "${DANGEROUS_PATTERNS[@]}"; doif echo "$COMMAND" | grep -qE "$pattern"; thenecho "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2exit 2fidoneexit 0
脚本读取传入命令,与危险列表比对;一旦匹配,就阻止执行。
Claude 会看到什么
当 Claude 尝试运行被阻止的命令时,会看到明确消息:
BLOCKED: 'git push origin main' matches dangerous pattern 'git push'.The user has prevented you from doing this.
Claude 会理解约束并调整行为。这是一道硬护栏,而不是埋在文字说明里的建议。
验证是否生效
安装后测试护栏:
- 清空对话上下文
- 让 Claude 运行
git push - 观察命令失败并查看阻止消息
这可以确认 Hook 已启用,而且 Claude 无法意外绕过它。
总结
祝使用愉快!制作这类技能非常有趣。如果想获取更多技能,欢迎订阅我的 Newsletter。