26 pontos por GN⁺ 2026-02-21 | 4 comentários | Compartilhar no WhatsApp
  • Um comando simples para resolver o antigo problema de limpar branches Git foi encontrado em documentação interna de desenvolvimento da CIA
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
  • O comando remove em lote os branches mesclados, exceto o branch atual e o master, a partir do resultado de git branch --merged
  • Também existe uma versão modificada para projetos modernos, excluindo os branches main e develop
  • Dá para registrá-lo como alias do Git para automatizar tarefas repetitivas e, embora seja simples, é uma ferramenta útil para melhorar continuamente a eficiência do trabalho e manter o repositório organizado

Dica de Git encontrada no Vault7

  • Os documentos Vault7, divulgados pelo WikiLeaks em 2017, incluíam ferramentas de hacking da CIA e documentos internos de desenvolvimento
    • Entre eles havia uma página com uma coletânea de dicas e truques de Git, e a maior parte tratava de usos comuns como corrigir commits, usar stash e bisect
  • Um comando de uma linha encontrado nesse material continua no meu ~/.zshrc até hoje

O problema dos branches antigos

  • Em repositórios Git locais, com o tempo, branches já mesclados vão se acumulando, o que dificulta a organização
    • Branches de feature, hotfixes e experimentos continuam aparecendo mesmo depois do merge, deixando a lista de git branch confusa
  • O comando git branch --merged permite ver os branches já mesclados, mas apagá-los manualmente é trabalhoso

O comando original do documento da CIA

  • O comando original apresentado é o seguinte
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d  
    
  • Explicação dos componentes
    • git branch --merged: exibe a lista de todos os branches locais mesclados ao branch atual
    • grep -v "\*\|master": exclui o branch atual (*) e o master
    • xargs -n 1 git branch -d: apaga com segurança os branches restantes, um por um (-d não remove branches que ainda não foram mesclados)

Versão modernizada do comando

  • Como a maioria dos projetos usa o branch main, o comando pode ser adaptado assim
    git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d  
    
  • Ao executá-lo no branch main após o deploy, dezenas de branches podem ser reduzidos a apenas alguns
  • Também é possível registrar esse comando como alias para executá-lo com praticidade
    alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'  
    
    • Depois disso, basta digitar ciaclean no repositório para fazer a limpeza automaticamente

Eficiência e praticidade

  • Esse comando ajuda a economizar alguns minutos por semana e a manter a lista de branches limpa
  • Embora simples, é visto como uma ferramenta prática que proporciona ganhos contínuos de produtividade

4 comentários

 
foriequal0 2026-02-21

Tem alguém nos comentários do HN dizendo que usa um programa que eu criei.

I use git-trim for that:
https://github.com/foriequal0/git-trim
The README também explica por que ele é melhor do que um bash-oneliner em alguns casos.
https://news.ycombinator.com/item?id=47089533

 
youngminz 2026-02-21

Eu também uso um alias chamado git gone. É muito prático - alias.gone = ! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '$2 == "[gone]" {print $1}' | xargs -r git branch -D

 
a1eng0 2026-02-21

Eu não uso git puro, mas estou organizando com uma ferramenta chamada gh-poi.

https://github.com/seachicken/gh-poi

 
GN⁺ 2026-02-21
Comentários do Hacker News
  • Eu uso um alias chamado git tidy para limpar branches
    Não apaga as branches padrão (main, master) e também não mexe na branch atual nem em branches de outros worktrees
    Branches que sumiram do remoto também são apagadas automaticamente, e o código está na configuração dos meus dotfiles

    • Usar init.defaultBranch é arriscado. O nome da branch padrão pode variar por repositório, e essa configuração é global, então precisa ser definida de antemão
      Eu criei um alias chamado git default para detectar automaticamente a branch padrão real no remoto (origin)
    • Esse script é realmente útil, então seria bom contribuir com ele para o git extras
  • Eu uso um comando de limpeza integrado ao fzf
    Dá para pré-selecionar branches mescladas e apagá-las de uma vez, e também excluir algumas se quiser
    Ele também limpa as branches remotas, e o código está na minha configuração do .gitconfig
    Além disso, uso a variável user.primaryBranch para definir branches padrão diferentes por repositório

    • Acho que talvez usar init.defaultBranch no lugar também funcione. Mesmo em repositórios já inicializados, dá para configurar com git config --local init.defaultBranch main
    • Também dá para fazer pull de outra branch sem trocar para ela. Por exemplo, git pull origin main:main e depois git rebase main
  • git branch --merged não funciona direito em repositórios que usam squash merge
    Isso porque o SHA do commit resultante do squash é diferente do HEAD original da branch
    Tenho curiosidade sobre ferramentas que consigam detectar com segurança branches que passaram por squash

    • Recentemente alterei meu script para apagar quando as condições forem “sem commits nos últimos 30 dias” + “sem branch no remoto”
      Não é perfeito, mas é bem prático, e sempre mostra um prompt de confirmação antes de apagar
      Consultei a configuração de exclusão automática de branches do GitHub
    • Além de squash merge, rebase merge também não é detectado
      Na maioria dos casos, isso é tratado com um hook no evento de exclusão da branch remota
    • Eu simplesmente apago a branch local quando a branch remota some
      Uso um alias chamado git gone para rodar git fetch -p e depois limpar branches no estado [gone]
    • Trabalho em um ambiente que usa Gerrit, então o rebase acontece no servidor
      Por isso uso um script que combina três métodos: git branch --merged, git cherry e git log grep
      Ainda assim, podem ocorrer falsos positivos se commits tiverem sido amendados ou se houver vários commits
    • Parece que tentar um rebase da branch primeiro permitiria detectar uma branch vazia
  • Eu uso um alias chamado git lint para limpar branches mescladas
    Ele exclui main, master e stable, e eu costumo usar bastante a combinação git pull --prune && git lint

  • O comando Git em si é comum, mas foi interessante acabar vendo um documento cuja fonte era o Wikileaks ao clicar
    O projeto “Fine Dining” da CIA era uma ferramenta para disfarçar malware escondido em USB como se fosse um aplicativo

    • Isso parece mais uma técnica comum de espionagem. O realmente ‘insano’ eram experimentos como o MKULTRA, em que colocavam LSD nas pessoas sem elas saberem
  • O problema original também poderia ser resolvido simplesmente imprimindo a lista de branches não mescladas

  • É estranho que uma tarefa tão natural exija várias linhas de bash
    Com uma base de código tão grande, é uma pena que o Git não ofereça isso como recurso nativo
    Consultei também este post de blog relacionado

    • Mas, se você aprender um pouco de xargs ou de loop for, isso vira algo trivial
      Transformar isso em comando embutido pode até acabar sendo mais complexo, porque teria de lidar com muitos casos de exceção
    • Julgar esse tipo de coisa por “número de linhas de código” parece um critério estranho
  • No fim, também houve a reação de que “parece alguém que acabou de aprender xargs”

    • Essa atitude soa como gatekeeping. Compartilhar algo novo que se aprendeu é positivo
      Eu mesmo aprendi coisas assim por blogs e textos no passado
    • Mas o fato de a pessoa ter aprendido isso em um documento da CIA parece um retrato da geração atual. Hoje se aprende mais pela internet do que pela escola
    • Houve reações negativas, mas esse tipo de combinação de utilitários é justamente o charme da CLI
    • Sendo de uma fonte da CIA ou não, se alguém acabou de aprender xargs, isso por si só já é legal
    • Para a geração da Bell Labs, isso pode parecer conteúdo básico demais
  • Ultimamente estou viciado em TUI. Quando algo é desconfortável de usar, peço ao Claude-code para criar uma TUI para mim
    Usei a biblioteca Textual para criar uma TUI de gerenciamento de Git worktree, e o Claude lida muito bem com código Python

    • Também recomendaram o tig, uma TUI antiga para Git. É boa até para buscar inspiração
    • Também houve quem dissesse ter receio de que o código escrito pelo Claude bagunce o repositório Git
    • Algumas pessoas nem sabiam o que era TUI
    • Se for uma TUI para Git, recomendo fortemente o Magit. Também ajuda no aprendizado
      Vale consultar também este texto sobre a funcionalidade de rebase do Magit
    • Eu também tenho várias ferramentas pequenas feitas com Claude. Fiquei curioso para saber se foram publicadas como open source
  • Eu também implementei algo parecido no Fish shell
    É uma função para selecionar com fzf branches que sumiram do remoto e apagá-las
    Está no código dos meus dotfiles