Hooks de git: automatizando antes do commit/push
Esperar o CI reprovar pra descobrir que esqueceu um console.log é lento — hooks rodam a checagem antes, na sua máquina.
Você commita, dá push, espera o CI rodar (às vezes minutos), e só então descobre que o lint reprovou por causa de um console.log esquecido. O feedback existe, mas chegou tarde — depois de já ter saído da sua máquina. Hooks são scripts que o git roda automaticamente em certos momentos (antes do commit, antes do push...) — a mesma checagem, só que rodando na hora, antes de qualquer coisa sair do seu computador.
O que é um hook, na prática
Todo repositório git tem uma pasta .git/hooks/ com exemplos desativados. Um hook é só um script executável com um nome específico — o git chama esse script sozinho no momento certo, e se ele terminar com erro, a ação (commit, push...) é cancelada.
ls .git/hooks/Os principais: pre-commit (roda antes do commit ser criado — ótimo pra lint e formatação), commit-msg (roda depois de escrever a mensagem — valida se ela segue um padrão), e pre-push (roda antes de mandar pro remoto — ótimo pra rodar os testes).
O problema de configurar isso manualmente
A pasta .git/hooks/ não é versionada — ela fica de fora do repositório, então cada pessoa do time precisaria copiar os scripts manualmente depois de clonar. Isso não escala: é fácil esquecer, e não tem como forçar todo mundo a ter os hooks ativos.
Husky + lint-staged: a automação que o time inteiro compartilha
Husky resolve o problema de distribuição — ele guarda a configuração dos hooks dentro do próprio repositório (versionada, num arquivo de configuração), e se instala automaticamente pra todo mundo que rodar npm install. lint-staged complementa rodando o lint só nos arquivos que estão na staging area, não no projeto inteiro — muito mais rápido.
npx husky init
echo "npx lint-staged" > .husky/pre-commit{
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"]
}
}git commit -m "Adiciona cálculo de frete"O commit é bloqueado antes mesmo de existir — nenhum código com erro de lint chega a entrar no histórico, muito menos a subir pro CI.
Por que isso é mais rápido que esperar o CI
CI roda numa máquina remota, geralmente depois do push — o ciclo é: escrever código, commitar, pushar, esperar a pipeline (build + testes + lint), só então ver o resultado. Um hook roda local, em segundos, antes do commit sequer existir. O erro mais comum (lint, formatação, teste quebrado óbvio) é pego no ponto mais barato possível de corrigir — antes de qualquer coisa sair da sua máquina. CI continua necessário como rede de segurança final, mas hooks evitam que a maioria dos erros triviais cheguem até lá.
Exercício
Um time quer garantir que ninguém commite código com erro de ESLint, e que essa checagem funcione automaticamente para qualquer pessoa que clonar o repositório, sem configuração manual. Que combinação de ferramentas resolve isso, e por que copiar scripts manualmente pra .git/hooks/ não seria suficiente?