AIHero
    阅读约 3 分钟

    这个 Hook 能阻止 Claude Code 运行危险的 Git 命令

    学习如何使用 PreToolUse Hook 阻止 Claude Code 中的危险 Git 命令,通过 Git 护栏避免意外数据丢失。

    Matt Pocock
    Matt Pocock
    本页目录

    我制作了一个技能,可以彻底阻止 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 运行危险命令。

    会阻止哪些命令

    该技能默认阻止以下危险模式:

    • git push (包括所有变体,例如 --force)
    • git reset --hard
    • git clean -f / git clean -fd
    • git branch -D
    • git checkout . / git restore .

    这些并非“永远不允许”的规则,而是“默认安全”的规则。

    安装时可以自定义阻止模式,也可以随时编辑。如果工作流确实需要 Claude 推送到远程 PR,可以放行。

    工作原理:Hook 系统

    该技能使用一个 PreToolUse Hook,在 Claude 执行 Bash 命令前进行拦截。

    下面是过滤脚本:

    #!/bin/bash
    INPUT=$(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[@]}"; do
    if echo "$COMMAND" | grep -qE "$pattern"; then
    echo "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2
    exit 2
    fi
    done
    exit 0

    脚本读取传入命令,与危险列表比对;一旦匹配,就阻止执行。

    Claude 会看到什么

    当 Claude 尝试运行被阻止的命令时,会看到明确消息:

    BLOCKED: 'git push origin main' matches dangerous pattern 'git push'.
    The user has prevented you from doing this.

    Claude 会理解约束并调整行为。这是一道硬护栏,而不是埋在文字说明里的建议。

    验证是否生效

    安装后测试护栏:

    1. 清空对话上下文
    2. 让 Claude 运行 git push
    3. 观察命令失败并查看阻止消息

    这可以确认 Hook 已启用,而且 Claude 无法意外绕过它。

    总结

    祝使用愉快!制作这类技能非常有趣。如果想获取更多技能,欢迎订阅我的 Newsletter。