DevOps Mind
Como deletar branch remota no Git de forma automatizada
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 e o processo de deletar branch remota, uma vez que as obsoletas continuam presentes.
Tópicos
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, facilitando o processo de deletar branch remota, mantendo assim o repositório Git mais organizado e eficiente. Sua importância se estende a várias áreas:
- 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.
- 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.
- 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.
- 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.
- 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 deletar branch remota automaticamente
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 #### devopsmind.com.br
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:
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 chamadadate
.echo ${date}
: Esta linha imprime a data formatada no console.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”.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”. Otee
é usado para mostrar a saída no console e também salvá-la no arquivo.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”.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 comandogit push --delete origin
para excluir cada uma delas remotamente(neste caso, não é para deletar branch local).
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.
Na sequência vou fornecer alguns passos para fazer o mesmo procedimento focando em excluir branch local apenas.
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.
Deletar branch local
Para excluir branch local, temos um procedimento um pouco diferente.
Existe um comando semelhante para deletar branches locais. Vou explicar como fazer isso e dar algumas recomendações sobre o gerenciamento de branches.
Para deletar branches locais que já foram mescladas, você pode usar um comando parecido:
git branch --merged | grep -v "\*" | grep -v "master" | grep -v "main" | grep -v "dev" | xargs -n 1 git branch -d
Esse comando faz o seguinte:
- Lista todas as branches mescladas
- Remove a branch atual (marcada com *)
- Remove as branches principais (master, main, dev)
- Deleta as branches restantes
Recomendações e boas práticas:
- Backup: Antes de executar qualquer script de limpeza, faça um backup do seu repositório.
- Revisão manual: É sempre bom revisar a lista de branches a serem deletadas antes de executar a remoção automática.
- Proteja branches importantes: Certifique-se de que branches importantes (como master, main, dev) não sejam deletadas acidentalmente.
- Use a opção
-d
em vez de-D
: A opção-d
só deleta branches que já foram totalmente mescladas, oferecendo uma camada extra de segurança. - Mantenha registros: Como seu script faz, é uma boa prática manter logs das branches deletadas.
- Sincronize local e remoto: Após remover branch local, atualize seu repositório local com
git fetch --all --prune
. - Limpeza periódica: Estabeleça uma rotina regular para limpeza de branches, por exemplo, mensalmente.
- Comunicação com a equipe: Informe sua equipe sobre a limpeza de branches para evitar confusões.
- Use ferramentas de CI/CD: Considere automatizar a limpeza de branches como parte do seu pipeline de CI/CD.
- Política de nomenclatura: Implemente uma política clara de nomenclatura de branches para facilitar a identificação de branches obsoletas.
Aqui estão alguns cenários onde essa abordagem é interessante:
1. Manutenção e Limpeza Local Regular:
- Organização do Ambiente de Trabalho: Se você trabalha em diferentes funcionalidades ou correções de bugs, pode acabar com várias branches locais que já foram mergeadas. Manter o ambiente de trabalho local limpo facilita a navegação e a gestão do projeto, sem impactar o repositório remoto.
- Desenvolvedores Individuais: Em equipes, os desenvolvedores podem preferir deletar branches locais após o merge para evitar confusão, enquanto mantêm as branches remotas para revisão ou para que outros membros da equipe as utilizem.
2. Evitar Afetar o Repositório Remoto:
- Branches em Revisão: Em alguns casos, as branches podem já ter sido mergeadas localmente, mas ainda precisam permanecer no repositório remoto para revisão por pares ou para integração contínua (CI/CD). O script que deleta apenas as branches locais garante que o processo remoto não seja interrompido.
- Políticas de Versionamento: Algumas organizações ou projetos seguem políticas específicas onde apenas certos membros da equipe têm permissão para deletar branches remotas. Um script local permite a limpeza sem violar essas políticas.
3. Experimentos Locais ou Funcionalidades Não Completas:
- Prototipagem e Experimentação: Durante o desenvolvimento, você pode criar várias branches experimentais ou de protótipo que nunca foram destinadas a serem enviadas para o repositório remoto. Nesse caso, um script para deletar branches locais permite que você limpe esses experimentos sem tocar nas branches remotas.
- Desenvolvimento Parcial: Às vezes, uma branch local pode ter sido criada para uma funcionalidade que acabou sendo descartada ou implementada de outra maneira. Deletar essa branch local sem afetar a remota garante que o repositório remoto não seja afetado por trabalho incompleto ou irrelevante.
4. Redução de Riscos:
- Evitar Erros Acidentais: Excluir branches remotas pode ser uma ação irreversível ou que cause problemas para a equipe. Ao criar um script que exclui apenas branches locais, você reduz o risco de deletar algo que outra pessoa ainda precisa.
- Desempenho Local: Muitos branches locais podem sobrecarregar algumas ferramentas de desenvolvimento e retardar operações do Git localmente. Um script para deletar apenas branches locais ajuda a manter a performance.
Script para excluir branch local de forma automatizada
#!/bin/bash
# Data atual para logs
date=$(date +"%d%m%Y")
# Arquivo de log
log_file="branch_cleanup_log_${date}.txt"
echo "Iniciando limpeza de branches em $(date)" > "$log_file"
# Listar branches mescladas, excluindo as principais
branches_to_delete=$(git branch --merged | grep -v "\*" | grep -v "master" | grep -v "main" | grep -v "dev")
# Mostrar branches que serão deletadas #### devopsmind.com.br
echo "Branches a serem deletadas:" | tee -a "$log_file"
echo "$branches_to_delete" | tee -a "$log_file"
# Pedir confirmação
read -p "Deseja prosseguir com a deleção? (s/n) " confirm
if [ "$confirm" = "s" ] || [ "$confirm" = "S" ]; then
echo "$branches_to_delete" | xargs -n 1 git branch -d | tee -a "$log_file"
echo "Limpeza concluída em $(date)" | tee -a "$log_file"
else
echo "Operação cancelada pelo usuário" | tee -a "$log_file"
fi
echo "Log salvo em $log_file"
Este script faz o seguinte:
- Cria um arquivo de log com a data atual.
- Lista as branches mescladas, excluindo as principais (master, main, dev).
- Mostra as branches que serão deletadas e pede confirmação do usuário.
- Se confirmado, deleta as branches e registra as ações no log.
Este método é mais seguro porque:
- Mostra quais branches serão deletadas antes de agir.
- Pede confirmação do usuário.
- Mantém um log detalhado das ações.
- Usa a opção
-d
, que só deleta branches totalmente mescladas.
Lembre-se de que a gestão de branches deve ser adaptada ao fluxo de trabalho da sua equipe e às necessidades específicas do projeto. É sempre uma boa ideia discutir e acordar estas práticas com toda a equipe antes de implementá-las.
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, muito bom você tocar nestes assuntos. Não é um problema atual e como cada vez mais temos várias equipes atuando em um mesmo código o potencial de desordem amplifica. Fiquei somente com uma dúvida. Com relação ao script, ele normalmente é testado em ambiente controlado antes de submenter qualquer coisa em produção correto? Eu imagino que ele poderia “recomendar” uma revisão do script removendo os branchs e garantindo nenhuma quebra de dependência e, naturalmente, reduzindo o tempo de teste pré rollout\deployment. Parabéns pelo seu artigo.
Abraço.
Pedro
Obrigado pela contribuição, Pedro!
Sim, além da desordem, vai tornando o repositório pesado, gerando alguns problemas adicionais.
Na confeccção do script, foram realizados testes num ambiente de desenvolvimento, para evitar problemas em produção. Mas estas revisões, validações e/ou testes pré rollout, são ótimas idéias para uma v2 deste script. Vou deixar anotada esta idéia!
Que bom que gostou do artigo, obrigado.
Abraço