Automatize Seu Fluxo de Trabalho: Um Guia Prático para Hooks Git do Lado do Cliente
Hooks Git são ferramentas poderosas, mas muitas vezes subutilizadas, dentro do ecossistema Git. Elas permitem que os desenvolvedores acionem automaticamente scripts personalizados em pontos específicos do fluxo de trabalho de desenvolvimento—antes ou depois de eventos como commitar, fazer push ou mesclar (merge). Para desenvolvedores individuais que trabalham em um repositório local, os hooks do lado do cliente são essenciais para impor a qualidade do código, executar testes locais e padronizar verificações de pré-submissão sem depender da imposição central do lado do servidor.
Este guia explorará a mecânica dos hooks Git do lado do cliente, focando nos tipos mais comuns e úteis: pre-commit e post-merge. Ao dominar esses hooks, você pode automatizar tarefas repetitivas, identificar erros precocemente e melhorar significativamente a consistência e a confiabilidade em seu processo diário de desenvolvimento.
Entendendo os Hooks Git
Hooks Git são scripts executáveis que o Git executa automaticamente antes ou depois de certas operações centrais. Eles residem no diretório .git/hooks de todo repositório Git. O Git é fornecido com hooks de exemplo (geralmente terminados em .sample), mas eles só se tornam ativos quando você os renomeia para remover a extensão .sample.
Hooks do Lado do Cliente vs. Lado do Servidor
É crucial distinguir entre os dois tipos principais:
- Hooks do Lado do Cliente: Executados na máquina local do desenvolvedor (por exemplo,
pre-commit,commit-msg). São excelentes para validação local e melhorias na experiência do usuário. - Hooks do Lado do Servidor: Executados no servidor central quando um push é recebido (por exemplo,
pre-receive,post-receive). Estes são tipicamente usados para políticas de imposição em todo o projeto.
Nota Importante: Como os hooks do lado do cliente são locais, eles não são automaticamente clonados ou compartilhados quando você clona um repositório. Qualquer configuração deve ser feita manualmente por cada desenvolvedor, ou gerenciada por meio de scripts de inicialização.
Localizando e Habilitando Hooks do Lado do Cliente
Todos os hooks do lado do cliente estão localizados no diretório .git/hooks dentro do seu repositório.
Ao inicializar um novo repositório, o Git fornece modelos:
git init
# Isso cria um diretório .git/hooks preenchido com arquivos de exemplo como pre-commit.sample
Para habilitar um hook, basta renomear o arquivo de exemplo. Por exemplo, para habilitar o hook pre-commit:
cd .git/hooks
cp pre-commit.sample pre-commit
chmod +x pre-commit
Os scripts colocados aqui devem ser executáveis (daí o chmod +x). Eles geralmente são executados como scripts de shell, mas podem ser escritos em qualquer linguagem, desde que a linha shebang (#!/bin/bash, #!/usr/bin/env python, etc.) esteja presente e o interpretador esteja disponível.
Exemplo Prático 1: O Hook pre-commit
O hook pre-commit é executado um pouco antes de o Git solicitar uma mensagem de commit. É o local ideal para executar verificações no código que está sendo commitado.
Casos de Uso Comuns para pre-commit:
- Linting/Verificação de Estilo: Garantir que o código adere aos guias de estilo estabelecidos (por exemplo, ESLint, Black).
- Execução de Testes Unitários: Executar testes rápidos e críticos.
- Verificação de Sintaxe: Verificar a correção sintática básica.
- Prevenção de Commits Acidentais: Garantir que nenhuma chave secreta ou declaração de depuração permaneça.
Criando um Hook pre-commit Simples (Exemplo Shell)
Este script de exemplo verifica se algum arquivo preparado para o commit contém a palavra TODO: e falha no commit se for encontrado, forçando o desenvolvedor a resolver esses placeholders.
Crie o arquivo .git/hooks/pre-commit e adicione o seguinte conteúdo:
#!/bin/bash
# 1. Verificar arquivos staged para 'TODO:'
STAGED_FILES=$(git diff --cached --name-only)
if grep -q "TODO:" <<< "$STAGED_FILES"; then
echo "\n[HOOK FAILED] Marcadores 'TODO:' encontrados em arquivos staged. Resolva-os antes de commitar."
# Mostrar os arquivos específicos contendo os marcadores (opcional)
git diff --cached | grep "TODO:"
exit 1 # Sair com status diferente de zero para abortar o commit
fi
# 2. Executar uma verificação de sintaxe básica em arquivos Python (requer 'python -m py_compile')
for FILE in $(git diff --cached --name-only --diff-filter=ACM | grep '\.py$'); do
echo "Verificando sintaxe para $FILE..."
python -m py_compile "$FILE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[HOOK FAILED] Erro de sintaxe encontrado em $FILE."
exit 1
fi
done
# Se todas as verificações passarem
echo "Verificações pre-commit passaram com sucesso."
exit 0 # Sair com status zero para permitir o commit
Se o script sair com um status diferente de zero (como exit 1), o Git aborta imediatamente o processo de commit e imprime a mensagem de erro.
Melhor Prática: Para linting e formatação complexos, considere usar ferramentas externas de gerenciamento de hooks, como Husky (para ecossistemas JavaScript) ou Pre-commit (uma ferramenta agnóstica a frameworks) que lidam com a instalação, compartilhamento e gerenciamento de dependências de hooks automaticamente.
Exemplo Prático 2: O Hook post-merge
O hook post-merge é executado imediatamente após a conclusão bem-sucedida de uma operação git merge. Este hook é útil para realizar limpeza ou atualizar dependências locais com base no código recém-mesclado.
Casos de Uso Comuns para post-merge:
- Atualização de Submódulos: Atualizar automaticamente repositórios dependentes.
- Reconstrução de Dependências: Executar
npm installou equivalente se os arquivos de dependência (package.json,requirements.txt) foram alterados. - Notificar Usuários: Exibir informações relevantes da branch.
Criando um Hook post-merge Simples (Atualização de Dependência)
Se o seu projeto usa Node.js, você pode querer garantir que node_modules esteja atualizado após mesclar uma branch que modificou package.json ou package-lock.json.
Crie o arquivo .git/hooks/post-merge:
#!/bin/bash
echo "Hook post-merge acionado."
# Verificar se package.json ou package-lock.json foram modificados no merge
if git diff --name-only HEAD@{1} HEAD | grep -Eq "(package\.json|package-lock\.json)"; then
echo "Arquivos de dependência modificados. Executando npm install..."
npm install
if [ $? -eq 0 ]; then
echo "Dependências atualizadas com sucesso."
else
echo "AVISO: npm install falhou após o merge. Por favor, execute 'npm install' manualmente."
fi
else
echo "Arquivos de dependência inalterados. Pulando npm install."
fi
exit 0
Este hook aproveita as capacidades de ref-log do Git (HEAD@{1} refere-se ao estado antes do merge) para comparar os arquivos, tornando a ação condicional e evitando execuções desnecessárias.
Outros Hooks do Lado do Cliente Úteis
Embora pre-commit e post-merge sejam amplamente utilizados, vários outros hooks do lado do cliente podem otimizar seu fluxo de trabalho:
commit-msg: Executa após o usuário inserir a mensagem de commit, mas antes que o commit seja finalizado. Útil para impor padrões de mensagem de commit (por exemplo, formato Conventional Commits).pre-rebase: Executa antes de um rebase começar. Pode verificar se certas branches devem ser protegidas de serem rebased.post-checkout: Executa após umgit checkoutser bem-sucedido. Útil para alternar variáveis de ambiente ou configurações de ferramentas com base na branch selecionada (checked-out).
| Nome do Hook | Ponto de Acionamento | Caso de Uso Principal |
|---|---|---|
pre-commit |
Antes da criação do commit | Linting de código, testes locais, formatação |
commit-msg |
Após a entrada da mensagem | Imposição de formato de mensagem (por exemplo, tickets JIRA) |
post-merge |
Após merge bem-sucedido | Atualização de submódulos, atualização de dependências |
post-checkout |
Após checkout bem-sucedido | Alternar configurações de ambiente |
Resumo e Próximas Etapas
Hooks Git do lado do cliente fornecem uma maneira com sobrecarga zero de automatizar tarefas repetitivas e impor padrões de qualidade locais diretamente em seu ambiente de desenvolvimento. Eles servem como uma primeira linha de defesa crucial contra commits desleixados e problemas de integração.
Para usá-los efetivamente:
- Identifique Tarefas Repetitivas: Determine verificações que você realiza manualmente antes de commitar ou mesclar.
- Localize
.git/hooks: Navegue até este diretório no seu projeto. - Habilite e Crie Scripts: Copie o arquivo
.sample, renomeie-o, certifique-se de que é executável (chmod +x) e escreva sua lógica de automação. - Considere Ferramentas de Gerenciamento: Para equipes, investigue ferramentas como
pre-commitpara sincronizar instalações de hooks entre desenvolvedores.