5 Hooks Git Simples para Gerenciar Seu Repositório

5 Git Hooks 00 Imagem em Destaque

Git é uma ferramenta brilhante. Ele permite que você não apenas rastreie suas alterações em um arquivo através de hooks, mas também colabore de forma contínua com outras pessoas. Nesse sentido, o Git é uma ferramenta que impulsionou o desenvolvimento de FOSS.

No entanto, um dos maiores problemas com o Git é que ele exige tempo e esforço para gerenciar seus repositórios. Por exemplo, fazer commits e sincronizar esses repositórios pode levar de dois a três comandos git. Isso torna o gerenciamento deles não apenas tedioso, mas também propenso a erros do usuário. Aqui mostramos alguns hooks Git simples, mas eficazes, para gerenciar melhor seus repositórios.

Nota: Você também pode gerenciar o Git no Emacs. Aprenda como!

Índice

  • O que são Hooks Git?
    1. Impedir o Push para o Master
    1. Rejeitar Pushes para o Branch Master
    1. Bloquear o Repositório de Rebasing
    1. Forçar uma Verificação de Estilo e Sintaxe no Seu Código
    1. Notificar Automaticamente Usuários sobre Mudanças no Repositório
  • Perguntas Frequentes

O que são Hooks Git?

Em sua essência, git-hook é um subcomando flexível que você pode usar para criar scripts personalizados que são executados sempre que o Git realiza uma ação em um repositório. Por exemplo, é possível usar um hook para verificar automaticamente seu repositório em busca de erros de estilo antes mesmo de você fazer um commit.

5 Git Hooks 02 Exemplo Linter

O subcomando hook funciona lendo a pasta “hooks” sob o diretório “.git” do seu repositório. Esta pasta contém uma série de arquivos pré-fabricados que fornecem um script de exemplo para cada ação no Git que você pode automatizar.

5 Git Hooks 03 Diretório de Hooks Padrão

Na maior parte, você pode escrever um hook git em qualquer linguagem de script que desejar. Isso o torna incrivelmente flexível e acessível para qualquer desenvolvedor de software.

Dica: para começar com o Git, você precisará configurar primeiro o nome de usuário e o e-mail do Git. Descubra como neste guia.

1. Impedir o Push para o Master

Um dos erros mais comuns que um usuário comete no Git é fazer um push de um commit de um branch de desenvolvimento diretamente para o master. Isso pode ser incrivelmente frustrante se você estiver usando o Github para rastrear e manter seus projetos.

5 Git Hooks 04 Exemplo Git Push

Você pode evitar esse problema criando um hook Git “pre-push” que verificará e confirmará sempre que você tentar fazer um push de um repositório do branch master.

  1. Vá para o repositório Git que você deseja proteger.

5 Git Hooks 05 Cd Para Repositório

  1. Crie um arquivo de hook Git com seu script de verificação. Como este é um hook que deve ser executado antes de um “push”, você precisa criar um arquivo de hook “pre-push”:
touch .git/hooks/pre-push
  1. Abra seu novo arquivo de hook em um editor de texto.
nano .git/hooks/pre-push
  1. Dentro, escreva seu novo hook “pre-push”. Por exemplo, o seguinte é um script que pedirá sua confirmação quando você estiver fazendo push do branch master:
#!/bin/sh  
  
protect='master'  
current=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')  
  
if[$protect = $current]  
then  
read-p"Confirmar push para master? Y/n."-n1-r/dev/null  
then  
exit0  
fi  
exit1  
else  
exit0  
fi
  1. Salve seu novo hook. No nano, faça isso pressionando Ctrl + O, depois Ctrl + X.

5 Git Hooks 07 Pre Push Hook Preenchido

  1. Execute o seguinte comando para garantir que o Git possa executar seu novo hook.
chmod +x .git/hooks/pre-push

2. Rejeitar Pushes para o Branch Master

Além de impedir que você faça push para o master, você também pode criar um hook do lado do servidor que rejeitará qualquer push para seu branch master. Isso é incrivelmente útil se você estiver compartilhando um repositório com vários desenvolvedores.

5 Git Hooks 08 Exemplo de Log do Git

Corrija isso criando um hook “pre-receive” que automaticamente impedirá qualquer usuário restrito de fazer push para o branch master.

  1. Crie o arquivo de hook “pre-receive” em seu repositório remoto.
touch .git/hooks/pre-receive
  1. Abra este arquivo.
nano .git/hooks/pre-receive
  1. Adicione o script de rejeição em seu hook “pre-receive”. Por exemplo, as seguintes linhas de código devem funcionar imediatamente:
#!/bin/sh  
  
branch=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')  
  
blacklist=(alice bob)  
  
if[[${blacklist[*]} =~ $USER]]; then  
if["$branch" == "master"]; then  
echo"Você não tem permissão para fazer commit de alterações neste branch"  
exit1  
fi  
fi
  1. Salve seu novo arquivo de hook. No meu caso, preciso pressionar Ctrl + O, depois Ctrl + X para salvar o arquivo.

  2. Salve seu script de hook e torne-o executável.

chmod +x .git/hooks/pre-receive

Dica: você também pode usar um alias do Git para tornar o uso do Git mais eficiente.

3. Bloquear o Repositório de Rebasing

Outro erro comum que um usuário comete no Git é rebasing do branch atualmente ativo. Isso pode ser um problema frustrante se você estiver trabalhando em um repositório com vários colaboradores, pois o rebasing removerá os commits que outros usuários fizeram.

5 Git Hooks 11 Página de Manual do Git Rebase

Você pode evitar esse problema criando um hook “pre-rebase” que verificará se o branch atual está bloqueado.

  1. Crie um arquivo “pre-rebase” em seu diretório “.git/hooks”:
touch .git/hooks/pre-rebase
  1. Abra este arquivo para edição.
nano .git/hooks/pre-rebase
  1. Adicione o script de rebase dentro do seu novo arquivo de hook.
#!/bin/sh  
  
branch="$2"  
[-n"$branch"]||branch=$(git rev-parse--abbrev-ref HEAD)  
lock="branch.${branch}.rebaselock"  
  
if["$(git config --bool "$lock")" = true]; then  
echo"hook pre-rebase: "$lock" está definido como verdadeiro. Recusando-se a rebase."  
exit1  
fi
  1. Salve seu novo arquivo de hook e torne-o executável.
chmod +x .git/hooks/pre-rebase

4. Forçar uma Verificação de Estilo e Sintaxe no Seu Código

Uma das utilizações mais úteis de um hook Git é vinculá-lo a um linter de código. Este é um programa simples que verifica se seu código segue o estilo e o formato de um projeto.

5 Git Hooks 14 Página de Manual do Shellcheck

  1. Para vincular um linter ao seu repositório Git, primeiro crie um arquivo de hook “pre-commit”.
touch .git/hooks/pre-commit
  1. Instale o linter apropriado para a linguagem do seu projeto. Neste caso, estou usando “shellcheck” para analisar meu código Bash:
sudo apt install shellcheck
  1. Abra seu novo arquivo de hook e adicione o seguinte script.
#!/bin/bash  
forfilein $(git diff--cached--name-only--diff-filter=AM |grep-E'\.sh$')  
do  
  
shellcheck "$file"# Execute o linter para cada novo arquivo.  
  
if[$?-ne0]; then  
exit1# Terminar o commit se o linter falhar.  
fi  
done
  1. Salve seu novo arquivo de hook e torne-o executável:
chmod +x .git/hooks/pre-commit

5. Notificar Automaticamente Usuários sobre Mudanças no Repositório

Por fim, você também pode criar um hook Git que enviará automaticamente um e-mail sempre que seu repositório receber um novo commit. Isso é útil se você quiser criar um sistema de notificação simples para seu repositório.

  1. Crie um arquivo de hook “post-receive” no diretório .git/hooks do seu repositório:
touch .git/hooks/post-receive
  1. Abra seu novo arquivo de hook Git e insira o seguinte script:
#!/bin/sh  
  
commit_message=$(git log-1--pretty=%B)  
users=("[email protected]""[email protected]""[email protected]")  
  
for user in"${users[@]}"; do  
    mail -s"Novo Commit: $commit_message"$user
  1. Salve seu novo arquivo de hook e torne-o executável.
chmod +x .git/hooks/post-receive

Perguntas Frequentes

Posso escrever meus hooks Git em uma linguagem compilada, como C?

Uma das maiores limitações dos hooks Git é que ele exige que você use uma linguagem que você possa executar diretamente do terminal. Isso significa que os hooks Git não suportam nenhuma linguagem compilada para seus scripts. Por exemplo, você pode criar um novo hook Git usando Python ou Shell, mas não C ou C++.

É possível executar múltiplos hooks no mesmo repositório Git?

Sim. Embora os exemplos acima mostrem hooks como recursos únicos e discretos, você pode facilmente misturá-los para criar seu próprio fluxo de trabalho exclusivo, tornando os hooks Git incrivelmente flexíveis e adaptáveis para qualquer situação de codificação. Por exemplo, você pode usar tanto o hook “Impedir Push para Master” quanto o hook “Verificação de Sintaxe” em seu próprio repositório.

Por que os hooks de e-mail do Git não estão enviando e-mails para os usuários?

Esse problema é mais provável devido ao seu servidor remoto não conseguir enviar corretamente quaisquer e-mails de saída. Para corrigir isso, certifique-se de que seu servidor remoto esteja seguro e que tenha um agente de entrega de e-mail funcionando junto com um domínio SMTP.

Crédito da imagem: Unsplash. Todas as alterações e capturas de tela Ramces Red.