DEV Community 👩‍💻👨‍💻

Cover image for Controle de fluxo com GitFlow: Git Hooks, proibindo commit's
Juliano Colere Ceccon Moreira
Juliano Colere Ceccon Moreira

Posted on • Updated on

Controle de fluxo com GitFlow: Git Hooks, proibindo commit's

Introdução

Acredito que todos nós estamos familiarizados com branches e commit's aqui (e se você não sabe, não tem problemas, eu recomendo dar uma lida neste artigo). E provavelmente você utiliza o GitFlow em seus projetos, ou sabe o que ele é (se não sabe acredito que deveria dar uma lida nesse artigo da Atlassian).

Mas quando o seu projeto local é enviado para uma plataforma de repositórios online, como o GitHub, como proibir commit's na master, na develop e controlar o fluxo das alterações e de merges? Bom, este post veio com o intuito disso!

Antes de iniciarmos devemos proibir que os desenvolvedores e colaboradores de nosso projeto possam fazer commit's diretamente nas branches: main (ou master) e develop

Mas porque iriamos querer bloquear os commit's nestas branches? Simples! Para evitar que a versão em produção e em desenvolvimento não seja alterada diretamente, isso irá prevenir o seu projeto de muitas falhas e lhe proporcionar uma noite a mais de sono :)

Bom, chega de enrolação, vamos ao ponto...

GitFlow

Precisamos, antes de tudo, inciar um repositório local, as alterações ensinadas abaixo podem ser usadas em um projeto criado com o Git convencional ou com o GitFlow.

Alternativa 1 - Usando o Git tradicional

Antes de tudo deve inciar um repositório do Git:

~$ git init
Enter fullscreen mode Exit fullscreen mode

Agora você deve criar e mudar para a branch develop:

~$ git checkout -b develop
Enter fullscreen mode Exit fullscreen mode

Alternativa 2 - Usando GitFlow

Antes de tudo deve inciar um repositório do Git:

~$ git flow init
Enter fullscreen mode Exit fullscreen mode

Git Hooks

Para proibir localmente commit's nas branches locais iremos utilizar o Git Hooks, uma serie de scripts que são rodados ao utilizar um comando Git (saiba mais aqui). Para podermos bloquear iremos usar o hook pre-commit, ele roda um script no momento que o git commit é chamado.

Implementando Git Hook's

Começaremos criando um diretório na raiz de nosso projeto chamado .githooks (você possui a liberdade de chamar como quiser).

Dentro desta pasta iremos criar um arquivo chamado pre-commit. E neste aquivo colocaremos o seguinte trecho de código:

#!/bin/sh
# Antes de qualquer alteração no código rode: 
# git config --local core.hooksPath .githooks/

branch="$(git rev-parse --abbrev-ref HEAD)" # A branch aonde esta sendo 
                                            # feito o commit
RED='\033[0;31m'
NC='\033[0m' # No Color

if [ "$branch" = "main" ]; then # Se a sua branch principal for a master
                                # basta mudar de main para master
  # Mudando a cor do terminal e mostrando um erro                              
  echo -e "${RED}Você não pode fazer commit's direto na branch main.${NC}"
  exit 1 # Cancela a operação
fi

if [ "$branch" = "develop" ]; then
  # Mudando a cor do terminal e mostrando um erro 
  echo -e "${RED}Você não pode fazer commit's direto na branch develop.${NC}"
  exit 1 # Cancela a operação
fi

# Caso queira adicionar mais branches o processo é o mesmo,
# basta copiar o if e mudar o nome da branch

Enter fullscreen mode Exit fullscreen mode

O código em Shell Script acima irá receber a branch aonde está sendo feito o commit, e se o nome da branch corresponder a um dos casos presente no if ele irá mudar a cor do terminal para vermelho e mostrar uma mensagem de erro, e quebra a execução do comando com o exit 1.

Executando o script

Antes de qualquer commit devemos fazer algumas configurações em nosso repositório local. Precisamos customizar o diretório de hook's do nosso projeto, para isso basta rodar:

~$ git config --local core.hooksPath .githooks/ 

# Caso tenha nomeado diferente, basta mudar o nome do diretório.
Enter fullscreen mode Exit fullscreen mode

Para usuários de Unix (Linux e MacOS)

Os usuários do sistema operacional baseados em Unix, devem rodar no diretório .githooks o seguinte comando:

~$ chmod +x pre-commit
Enter fullscreen mode Exit fullscreen mode

Hora da verdade!

Agora podemos é a hora de ver se as nossas alterações funcionaram, vamos criar um arquivo em qualquer uma das branches bloqueadas:

~$ touch teste.txt
Enter fullscreen mode Exit fullscreen mode

Vamos adicionar o arquivo:

~$ git add .
Enter fullscreen mode Exit fullscreen mode

E vamos tentar fazer um commit:

~$ git commit -m "Sera que funcionou?"
Enter fullscreen mode Exit fullscreen mode

Rufem os tambores 🥁

Funcionou!
Terminal

Considerações finais

Não se esqueçam de fazer um merge da develop na main (ou master), assim a main vai ter a pasta .githooks, se não fizerem isso os commits na main estarão permitidos. E pode subir a pasta .githooks para seu repositório remoto, mas não se esqueça de avisar no README que deve rodar o comando de customizar os diretórios de hooks no projeto!

Top comments (0)

Update Your DEV Experience Level:

Settings

Go to your customization settings to nudge your home feed to show content more relevant to your developer experience level. 🛠