Automatizando a limpeza de branches no Git

Introdução

A gestão eficiente das branches em um repositório Git desempenha um papel crucial na manutenção de um ambiente de desenvolvimento limpo e organizado. À medida que as equipes de desenvolvimento colaboram em projetos, diversas branches são criadas. No entanto, muitas vezes, essas branches se tornam obsoletas após a conclusão de um recurso ou uma correção de bug. Como resultado, a negligência na remoção dessas branches obsoletas pode resultar em diversos problemas. Entre esses problemas, destacam-se os conflitos desnecessários, que podem surgir devido à coexistência de branches desatualizadas e as atuais. Além disso, a acumulação de branches obsoletas pode levar ao aumento da complexidade do repositório, dificultando a compreensão e a navegação. Por fim, essa negligência também pode tornar desafiador o processo de identificação das branches ativas, uma vez que as obsoletas ainda estão presentes.

Ideia

É nesse contexto que entra em cena o script de limpeza de branches no Git. Este script que irei fornecer, ele automatiza o processo de identificação e remoção de branches que já cumpriram seu propósito, mantendo assim o repositório Git mais organizado e eficiente. Sua importância se estende a várias áreas:

  1. Organização e Clareza: Manter um repositório Git limpo e livre de branches obsoletas ajuda os desenvolvedores a entenderem melhor a estrutura do projeto. Isso facilita a navegação, a busca por código relevante e a compreensão das relações entre as diferentes partes do software.
  2. Redução de Conflitos: Branches antigas e não utilizadas podem causar conflitos desnecessários durante o processo de mesclagem (merge) de código. A remoção adequada dessas branches reduz a probabilidade de conflitos e simplifica o processo de integração de código.
  3. Economia de Espaço: O repositório Git pode crescer consideravelmente com o tempo devido à acumulação de dados de branches antigas. A exclusão dessas branches contribui para economizar espaço em disco, tornando o repositório mais eficiente em termos de armazenamento.
  4. Segurança: A eliminação de branches que não são mais necessárias também contribui para a segurança. Isso ajuda a evitar o acesso não autorizado a código legado ou a branches que contenham informações sensíveis.
  5. Melhoria na Performance: Um repositório Git mais limpo tende a ter um desempenho melhor em operações de git, como clonagem, checkout e mesclagem. Isso é especialmente importante para equipes que trabalham em projetos de grande porte.

Em resumo, o uso de um script de limpeza de branches no Git é uma prática recomendada para manter a ordem e a eficiência em um ambiente de desenvolvimento colaborativo. Ele ajuda a evitar problemas comuns associados à gestão inadequada de branches e contribui para um fluxo de trabalho mais suave e produtivo, permitindo que os desenvolvedores se concentrem no que realmente importa: escrever código de alta qualidade e entregar software de forma mais eficaz.

Script para limpeza de branches

No meu cenário, utilizamos bastante a branch “dev”, que normalmente recebe o merge de diversas branches onde os times estão trabalhando. Porém, mesmo tendo uma opção de marcar para que aquela branch seja excluída durante o processo de fechamento do Pull Request, muitas branches vão ficando para trás, deixando o repositório mais pesado.

Para resolver isto, elaborei este script:

#!/bin/sh

date=$(date +"%d%m%Y")
echo ${date}

# Efetuando checkout para a Branch dev
git checkout dev

# Salvando relatórios com as listagens das Branches remotas e as Branches que já foram mergeadas
git branch -r --merged | tee /devops/branch_list_dev_${date}.txt
git branch -r --merged | grep --invert-match dev | tee /devops/branch_list_merged_dev_${date}.txt

# Efetuando a limpeza de Branches que já foram mergeadas com a Branch dev
git branch -r --merged | grep --invert-match dev | grep --invert-match HEAD | grep -v "am-alert" | grep "origin/" | cut --d "/" -f 2- | xargs -n 1 git push --delete origin

Explicação detalhada

Este script é um script de shell (bash) que executa uma série de comandos relacionados ao controle de versão Git. Aqui está uma explicação passo a passo do que cada parte do script faz:

  1. date=$(date +"%d%m%Y"): Esta linha obtém a data atual e a formata no formato “DDMMAAAA” (dia, mês e ano) e armazena o valor em uma variável chamada date.
  2. echo ${date}: Esta linha imprime a data formatada no console.
  3. git checkout dev: Este comando muda para a branch chamada “dev” usando o Git. Isso significa que o script agora está trabalhando na branch “dev”.
  4. git branch -r --merged | tee /devops/branch_list_dev_${date}.txt: Este comando lista todas as branches remotas que foram mergeadas na branch “dev” e redireciona a saída para um arquivo chamado “branch_list_dev_data.txt”. O tee é usado para mostrar a saída no console e também salvá-la no arquivo.
  5. git branch -r --merged | grep --invert-match dev | tee /devops/branch_list_merged_dev_${date}.txt: Este comando lista todas as branches remotas que foram mergeadas, exceto a branch “dev”, e redireciona a saída para um arquivo chamado “branch_list_merged_dev_data.txt”.
  6. git branch -r --merged | grep --invert-match dev | grep --invert-match HEAD | grep -v "am-alert" | grep "origin/" | cut --d "/" -f 2- | xargs -n 1 git push --delete origin: Este comando realiza uma série de ações:
    • Ele lista todas as branches remotas que foram mergeadas, exceto a branch “dev”.
    • Ele exclui qualquer linha que mencione “HEAD”.
    • Ele exclui qualquer linha que contenha a palavra “am-alert”.
    • Ele filtra apenas as branches que começam com “origin/”.
    • Em seguida, ele corta o prefixo “origin/” das linhas restantes.
    • Finalmente, ele usa xargs para iterar sobre essas branches e executa o comando git push --delete origin para excluir cada uma delas remotamente.

Em resumo, este script é utilizado para listar as branches remotas que foram mergeadas na branch “dev”, salvar essas listas em arquivos com base na data e, subsequentemente, excluir essas branches remotas (exceto a “dev”) que foram mergeadas. Essa ferramenta é valiosa para a limpeza de branches antigas e já mergeadas em um repositório Git. É fundamental certificar-se de que você compreende completamente o funcionamento de cada comando antes de executar o script em um ambiente de produção.

Importante

É crucial certificar-se de que você compreende completamente o funcionamento do script, uma vez que ele executa ações de difícil reversão. Assim, ao tomar os devidos cuidados, você pode elaborar rotinas onde esse script é executado periodicamente, assegurando a obtenção dos benefícios esperados sem quaisquer impactos indesejados.

Material de apoio

Conclusão

A utilização de um script de limpeza de branches no Git representa uma medida essencial para manter a integridade e eficiência de um repositório de código-fonte. Ao automatizar o processo de identificação e remoção de branches obsoletas, esse script desempenha um papel fundamental na promoção de um ambiente de desenvolvimento organizado e livre de complicações.

Além disso, a gestão adequada de branches não apenas aumenta a clareza e compreensão do projeto, mas também aprimora a colaboração entre membros da equipe. Isso, por sua vez, reduz significativamente a probabilidade de conflitos, economiza espaço em disco, fortalece a segurança e impulsiona o desempenho geral do repositório.

Em última análise, a prática regular de limpeza de branches constitui um componente essencial para a saúde sustentável do projeto, permitindo que a equipe de desenvolvimento concentre-se nas suas metas e objetivos principais. Portanto, ao adotar e manter um script de limpeza de branches como parte integral do seu fluxo de trabalho, você está fazendo um investimento valioso na qualidade e eficiência do desenvolvimento de software, contribuindo assim para a criação de produtos melhores e mais robustos. Não subestime o valor dessa ferramenta aparentemente simples, mas surpreendentemente poderosa, na sua jornada de desenvolvimento.

Fernando Müller Junior
Fernando Müller Junior

Eu sou o Fernando Müller, um Tech Lead SRE com 16 anos de experiência em TI, atualmente eu trabalho na Appmax, uma fintech localizada no Brasil. Apaixonado por trabalhar com arquiteturas e aplicações Cloud Native, ferramentas Open Source e tudo que existe no mundo SRE, sempre procurando se desenvolver e aprender constantemente(Lifelong learning), atuando em projetos inovadores!

Artigos: 28

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *