Uma leve introdução sobre Git Hooks

Vitor Ferraz Varela
5 min readApr 14, 2020

--

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.

Git Hooks

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
Atlassian 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".

Exemplos de Hooks

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.

Exemplo de pre-commit hook para rodar um linter no projeto

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:

Exemplo de pre-commit hook para testes unitários

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.

Exemplo de prepare-commit hook

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.

Exemplo de sysmlinks

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.

Linkedin

Instagram

Twitter

--

--