Gerador de Git pre-receive hook
Gera um script bash pre-receive para Git server-side com validações de branch, autor e tamanho de commit.
Hooks Git pre-receive: porteiros server-side para todo push
Git hooks são scripts executáveis que o Git roda automaticamente em eventos específicos no ciclo de vida de um repositório. Hooks locais ficam em .git/hooks/; hooks server-side ficam em hooks/ dentro de um repositório bare no servidor. Qualquer arquivo nesses diretórios cujo nome bata com um evento conhecido e que esteja marcado como executável (chmod +x) vira o handler daquele evento. Scripts podem ser em qualquer linguagem desde que comecem com o shebang correto: #!/bin/bash, #!/usr/bin/env python3, #!/usr/bin/env node — o Git apenas faz fork e executa.
O hook pre-receive é o ponto de enforcement mais poderoso de todo o protocolo Git. Ele roda uma vez por push, no servidor, antes de qualquer ref ser atualizada. Recebe uma linha por ref em stdin, no formato <old-sha> <new-sha> <ref-name>. Se o script sai com status não-zero, o push inteiro é rejeitado — todas as branches, todas as tags, de forma atômica. Não existe accept parcial.
Esqueleto do script
#!/bin/bash
# .git/hooks/pre-receive (chmod +x)
while read oldrev newrev refname; do
if [ "$refname" = "refs/heads/main" ]; then
echo "Push direto em main não é permitido" >&2
exit 1
fi
# Rejeita commits cuja mensagem não segue Conventional Commits
for sha in $(git rev-list "$oldrev".."$newrev"); do
msg=$(git log --format=%s -n 1 "$sha")
if ! echo "$msg" | grep -Eq '^(feat|fix|docs|chore|refactor|test)(\(.+\))?: '; then
echo "Commit $sha violou Conventional Commits: $msg" >&2
exit 1
fi
done
done
exit 0
Políticas comuns impostas pelo pre-receive
- Bloquear push direto em
main,masterourelease/*— forçar toda mudança a passar por pull request. - Validar mensagens de commit contra Conventional Commits, IDs de ticket no Jira ou regex customizada.
- Rejeitar segredos com
gitleaks detect --stagedoutrufflehogantes que vazem para o histórico. - Limitar tamanho do commit / push para evitar dumps de 5 GB poluindo o servidor.
- Exigir aprovação de code review via chamada de API à plataforma.
- Exigir commits assinados usando
git verify-commitem cada revisão.
A família completa de hooks
pre-commit— roda localmente antes dogit commitcriar o objeto de commit; perfeito para linters.commit-msg— recebe o caminho do arquivo de mensagem; permite validar ou reescrever.pre-push— roda localmente antes de transferir objetos para o remoto.pre-receive— roda no servidor antes de qualquer atualização de ref; rejeita o push inteiro.update— roda no servidor uma vez por ref; pode aceitar algumas refs e rejeitar outras.post-receive— roda no servidor depois das refs serem atualizadas; ideal para triggers de CI e deploys.post-merge,post-checkout,post-rewrite— hooks locais de notificação para plugins de IDE ou instaladores de dependências.
Suporte por plataforma e alternativas
Hooks server-side dependem totalmente da plataforma de hospedagem. Git puro (bare repo via SSH self-hosted) dá liberdade total. Gitea, Gogs e Forgejo expõem pre-receive pela UI admin. GitHub Enterprise Server suporta pre-receive hooks no nível da instância, mas o GitHub.com não — você precisa replicar as mesmas verificações via GitHub Actions, branch protection rules e required status checks. GitLab oferece push rules (Premium) e hooks server-side custom; Bitbucket Data Center tem seu próprio SDK. Sempre teste a matriz que você atende antes de depender de bash para enforcement.
Como hooks locais não são versionados com o repositório (tudo embaixo de .git/ é ignorado), eles não podem ser confiados como fronteira de segurança. Husky, lefthook, pre-commit e simple-git-hooks distribuem hooks via arquivos commitados no repo e religados via core.hooksPath, mas um contribuidor malicioso ainda pode burlar com git commit --no-verify. A única camada confiável de enforcement é o lado servidor — por isso o pre-receive importa.
FAQ
O GitHub.com aceita hooks pre-receive custom? Não. Use Actions com required status checks, branch protection rules e CODEOWNERS para enforcement de review.
Como instalar o hook? Copie o script para o diretório hooks/ do repositório bare e rode chmod +x pre-receive. O Git executa no próximo push.
Posso chamar programas externos do hook? Sim — bash, python, node, até binários compilados. Mantenha o startup barato; o hook roda em todo push e hooks lentos irritam dev.
Por que meu push trava para sempre? A saída do hook volta para o cliente pela rede. Se o script escreve em /dev/tty ou pede input, vai bloquear indefinidamente — sempre leia entrada apenas de stdin e escreva mensagens para o usuário em stderr.
Como furar o hook em emergência? Hooks server-side não podem ser burlados pelo cliente. Adicione um break-glass (ex: trailer [emergencia] que o hook reconhece) condicionado à membership do grupo, ou desabilite temporariamente o hook com acesso root no servidor.
Ferramentas Relacionadas
Gerador de Git post-merge hook
Gera um script post-merge para reinstalar deps quando package-lock muda, atualizar submodules e mostrar comandos novos.
Gerador de comando git rebase
Monte comandos git rebase com branch base, --interactive, --onto, --autosquash e --no-verify, prontos para colar.
Gerador de Conventional Commit
Monta uma mensagem de commit no formato Conventional Commits (feat:, fix:, chore:) com escopo opcional, breaking change e issue.
Gerador OAuth State
Gera tokens state aleatórios seguros (128 bits) para proteção CSRF em fluxos OAuth 2.0. Recomendado pela RFC 6749.
Gerador SVG Padrão Tijolos
Gera SVG tileable simulando alvenaria de tijolos com offset alternado, parametrizando dimensões e juntas.
Prompt DALL-E
Constrói prompt para DALL-E com estilo e tamanho.