branch-guard
Блокирует прямой push в main/master. Предлагает создать PR через GitHub CLI.
Описание
Простым языком
В разработке есть главная ветка кода — обычно main. Это то что работает в продакшене, на реальном сайте. Прямо туда писать опасно: одна ошибка — и сайт сломан. Этот хук блокирует попытку записать прямо в main.
Раньше AI мог запушить изменения прямо в основную ветку. Теперь хук говорит: нет, сначала создай отдельную ветку, потом Pull Request — чтобы кто-то проверил перед слиянием.
Что делает
Хук branch-guard блокирует прямой git push в ветки main и master. Все изменения должны проходить через Pull Request. Работает как дополнение к GitHub Branch Protection Rules — даже если защита на GitHub не настроена, хук не пустит.
AI иногда уверенно пишет git push origin main как само собой разумеющееся. Этот хук добавляет трение в правильном месте.
Когда срабатывает
Триггер: PreToolUse — до выполнения Bash. Условие: команда содержит git push в main или master. Действие: блокировка с предложением создать PR через gh pr create.
Установка
- Добавь конфиг
PreToolUseнаBashв.claude/settings.json - Создай
~/.claude/hooks/branch-guard.shс правамиchmod +x - Убедись, что установлен GitHub CLI:
gh --version
Конфиг settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/branch-guard.sh"
}
]
}
]
}
}Скрипт хука
#!/bin/bash
# branch-guard.sh — защита main/master от прямого push
# PreToolUse: Bash
CMD="${CLAUDE_TOOL_INPUT_COMMAND:-}"
if ! echo "$CMD" | grep -qE 'gits+push'; then
exit 0
fi
CURRENT_BRANCH=$(git branch --show-current 2>/dev/null)
PROTECTED="main|master|production|release"
if echo "$CMD" | grep -qE "gits+pushs+(origins+)?(${PROTECTED})"; then
echo "BLOCKED [branch-guard] Прямой push в защищённую ветку запрещён"
echo ""
echo "Вместо push в main — создай PR:"
echo " git push origin $CURRENT_BRANCH"
echo " gh pr create --title 'описание' --base main"
exit 2
fi
if echo "$CMD" | grep -qE 'gits+pushs+(--force|-f)'; then
if echo "$CURRENT_BRANCH" | grep -qE "^(${PROTECTED})$"; then
echo "BLOCKED [branch-guard] force push в $CURRENT_BRANCH запрещён"
echo "Используй: git push --force-with-lease"
exit 2
fi
echo "WARN [branch-guard] force push в $CURRENT_BRANCH — убедись что это нужно"
fi
exit 0Примеры работы
Что пропускает
git push origin feature/auth— feature-ветка проходит свободноgit push origin dev— dev-ветка не защищена по умолчаниюgit push --force-with-lease— безопасный force (допустим)
Что блокирует
git push origin main— прямой push в maingit push origin master— прямой push в mastergit push --force origin main— force push в защищённую ветку
Настройка под себя
- Добавь
staging|releaseв переменнуюPROTECTED - Настрой список через переменную окружения
PROTECTED_BRANCHES - Интегрируй с
gh apiдля проверки Branch Protection Rules из GitHub
main — это прод. В прод — через ревью. Хук не про бюрократию, а про то чтобы никогда не делать hotfix в 3 ночи потому что кто-то запушил напрямую.
> Пока нет комментариев
Связанный контент
Похожие инструменты
/pre-commit-check
Проверки перед коммитом: security scan, lint, типы, debug-код. Всё в одной команде.
Открыть →destructive-guard
Блокирует деструктивные bash-команды: rm -rf, DROP TABLE, git reset --hard. Спрашивает подтверждение.
Открыть →protect-secrets
Блокирует запись файлов с секретами: .env, токены, пароли, приватные ключи. Не даёт случайно закоммитить.
Открыть →security-scan
Автоматическое сканирование кода на SQL-инъекции, XSS и другие уязвимости при каждом Write/Edit.
Открыть →