Uma leve introdução sobre Git Hooks
Introdução
Hoje quero falar um pouco sobre uma das coisas mais interessantes do Git, os hooks, que é a possibilidade de disparar scripts customizados quando uma determinada ação ocorre.
Existem duas formas de disparar um hook, a primeira é no lado do servidor e a segunda no lado do cliente.
Client-side vs Server-side hooks
Client-side hooks são acionados por operações como commits e merges, enquanto que server-side rodam em operações de network como receber commits através de um push.
Hooks são flexíveis para você poder usar da melhor forma que necessitar, como verificar se os commits estão em um padrão estabelecido pelo time, ajustar a mensagem de commit para adicionar número do card da tarefa entre outros.
Instalando um hook
Todo repositório Git ao ser criado, gera um pasta .git, que, em geral, é oculta pelos sistemas operacionais.
Quando utilizamos o comando “git init” para inicializar um diretório git, os hooks ficam armazenados dentro do subdiretório “hooks” dentro do diretório do Git.
- .git/hooks
Ao abrir essa pasta podemos verificar que já existe alguns exemplos criados para gente e se você reparar todos os exemplos estão com a extensão ".sample" e para fazê-los funcionar, basta remover essa extensão.
Podemos escrever scripts em Rudy, Python, Perl ou qualquer outra linguagem de script contanto que seja um script executável e nomeado corretamente.
Na imagem abaixo podemos dar uma olhada no nome do arquivo referente a cada git hook e não vamos esquecer que para fazê-los funcionar, basta remover essa extensão ".sample".
Client-side hooks
Como falamos anteriormente, esse tipo de hook é executado no lado do cliente e é acionado por operações como commits e merges. Pode ser usado em workflows de commits, envio de e-mails entre outros.
Pre-commit
O primeiro hook que vamos dar uma olhada é o de “pre-commit”, que é executado antes mesmo da mensagem de commit. Normalmente é usado para inspecionar o que está prestes a ser realizado no commit, desta forma podemos validar se esquecemos de algo ou garantir que os testes foram rodados com sucesso etc.
Caso algum ponto não seja validado corretamente o commit é abortado, mas também é possível ignorar essas validações usando o comando “git commit — no-verify”.
Linter
Vamos ver um exemplo de um hook de "pre-commit" que executa um linter no seu projeto toda vez antes de executar o commit.
Observação: Não podemos esquecer de usar o comando “chmod +x” para deixar o script executável.
Ao realizar o commit podemos ver o hook sendo executado…
Rodar testes unitários
Um outro exemplo de hook de "pre-commit", é executar todos os testes unitários do projeto de forma automática antes de realizar o commit. Desta forma podemos validar se alguma alteração realizada quebrou alguma feature.
Podemos fazer isso com esse script:
Prepare-commit
Um outro hook bacana que podemos usar é o "prepare-commit", que nos permite executar um script antes da mensagem de commit ser executada e desta forma podemos alterar o conteúdo da mensagem para algum outro padrão ou fazer validações na mesma.
Alterando a mensagem de commit
Um bom exemplo disso é poder colocar um prefixo no nossos commits, podendo ser por exemplo o número do card da tarefa.
A variável "TICKET
" contém o número do card da tarefa.
Resultado final do commit
Desta forma ele irá verificar no nome dado para a branch da feature pelo nome do projeto e pegar o id referente ao card e colocar dentro de colchetes seguido pela mensagem, como nos exemplos a seguir:
feature/meuprojeto-123-alguma-feature
→[MEUPROJETO-123] mensagem do commit
bugfix/meuprojeto-789
→[MEUPROJETO-789] mensagem do commit
123_alguma_feature
→[123] mensagem do commit
Sincronismo de hooks entre times
Uma desvantagem de usar hooks do lado do cliente é que não é possível manter um rastreamento local pelo git ou seja os hooks que são alterados ficam somente na maquina de quem alterou.
Uma forma de fazer um sincronismo entre todos do time é utilizar o sysmlinks, que são links simbólicos para um arquivo, como se fossem um atalho e desta forma podemos colocar nossos hooks fora da pasta .git e assim é possível adicioná-los no rastreamento do git.
Como a maioria dos projetos precisa de algum tipo de script de inicialização, como por exemplo baixar o Carthage para gerenciar dependências em um projeto do Xcode, podemos criar um script que será executado no início do projeto para criar o sysmlink dos arquivos de hook.
Conclusão
Bom pessoal, esse post foi uma introdução aos git hooks. Neste artigo acabei utlizando alguns scripts focados em projetos no Xcode mas podem ser expandidos para qualquer outro cenário. Espero eu tenha consigo passar uma boa noção de como os hooks funcionam e o que é possível fazer com eles.
Dúvidas, críticas e sugestões por favor deixem nos comentários.