Como remover ramificações de rastreamento local que não existem mais no controle remoto

770

Com git remote prune origineu posso remover os ramos locais que não estão mais no controle remoto.

Mas também quero remover as ramificações locais criadas a partir dessas ramificações remotas (verificar se elas estão imersas seria bom).

Como posso fazer isso?

Alex
fonte
1
Uma linha, plataforma cruzada, não se parece com o gato que dormia no teclado: npx git-removed-branches(execução a seco) ou npx git-removed-branches --prune(de verdade). Você já precisa ter o node.js instalado. Veja as respostas abaixo para obter detalhes.
Cristian Diaconescu

Respostas:

892

Após a remoção, você pode obter a lista de ramificações remotas com git branch -r. A lista de ramificações com sua ramificação de rastreamento remoto pode ser recuperada com git branch -vv. Portanto, usando essas duas listas, é possível encontrar as ramificações de rastreamento remoto que não estão na lista de controles remotos.

Essa linha deve funcionar (requer bashou zshnão funciona com o shell Bourne padrão):

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

Essa sequência obtém a lista de ramificações remotas e a passa egreppela entrada padrão. E filtra as ramificações que possuem uma ramificação de rastreamento remoto (usando git branch -vve filtrando as que possuem origin), obtendo a primeira coluna dessa saída, que será o nome da ramificação. Por fim, passando todos os nomes de ramificações para o comando delete branch.

Como está usando a -dopção, ele não excluirá as ramificações que não foram mescladas na ramificação em que você está quando executa este comando.

Lembre-se de que você precisará executar git fetch --prune primeiro , caso contrário git branch -r, ainda verá as ramificações remotas.

Schleis
fonte
12
Isso funcionou para mim perfeitamente. De alguma forma, git fetch -pnem sempre é suficiente?
Stefan Hendriks
16
Infelizmente, isso não funciona no Git Bash no Windows. sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required Alguma ideia?
Ludder
37
Para adicioná-lo como um alias:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410
126
Existe algum comando proposto para uma versão futura do git que fará isso? Este comando se parece com o meu gato tem sido no meu laptop
Bron Davies
5
usar git branch -Dno final do comando funcionou melhor para nós, pois tendemos a esmagar os commits na mesclagem, o que gera The branch x is not fully mergederros ao executar com -d.
Mateus Gondim
430

Se você deseja excluir todas as ramificações locais que já foram mescladas no mestre, você pode usar o seguinte comando:

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

Mais informações .

jackocnr
fonte
4
Funcionou perfeito, eu acho! Alguém poderia explicar se essa resposta faz algo diferente da resposta aceita?
Andrew
11
Pequena melhoria: use xargs -r git branch -dpara que nada seja executado se não houver ramificações a serem excluídas. Note que a -rbandeira pode não estar disponível em todos os lugares
Jacob Wang
8
Como o grep pode não corresponder devido às cores do git:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
Mike D
5
O @NickRes, como você pediu muito bem, git branch --merged masterlista os ramos que são mesclados no mestre, a parte do meio grep exclui o próprio mestre (não queremos excluir o mestre!), E a última parte do xargs é executada git branch -d(excluir ramo) em cada um dos os resultados. Ou você pode apenas ler o link Mais informações fornecidas na resposta;)
jackocnr
14
Melhoria: git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d. A saída do git v2.10.1 exibirá "* master" quando o check-out do master. Eu me livre do mestre com ou sem um asterisco.
Esteban
162

Entre as informações apresentadas por git help fetch, existe este pequeno item:

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

Então, talvez, git fetch -pé o que você está procurando?

EDIT: Ok, para aqueles que ainda debatem esta resposta três anos após o fato, aqui está um pouco mais de informações sobre por que eu a apresentei ...

Primeiro, o OP diz que deseja "remover também as ramificações locais criadas a partir dessas ramificações remotas [que não estão mais no controle remoto]". Isso não é inequivocamente possível em git. Aqui está um exemplo.

Digamos que eu tenha um repositório em um servidor central e ele tenha duas ramificações, chamadas Ae B. Se eu clonar esse repo no meu sistema local, meu clone terá refs locais (ainda não são ramificações reais) chamados origin/Ae origin/B. Agora, digamos que eu faça o seguinte:

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

Os fatos pertinentes aqui são que, por algum motivo, escolhi criar uma ramificação no repositório local que tenha um nome diferente da sua origem e também tenho uma ramificação local que ainda não existe no repositório de origem.

Agora, digamos que eu remova os ramos Ae Bno repositório remoto e atualizo meu repositório local ( git fetchde alguma forma), o que faz com que meus representantes locais origin/Ae origin/Bdesapareçam. Agora, meu repo local tem três ramos ainda, A, Z, e C. Nenhuma delas possui uma ramificação correspondente no repositório remoto. Dois deles foram "criados a partir de ... ramificações remotas", mas mesmo que eu saiba que costumava haver uma ramificação chamada Bna origem, não tenho como saber que Zfoi criada a partir deB, porque foi renomeado no processo, provavelmente por um bom motivo. Então, realmente, sem algum processo externo que registre os metadados de origem da ramificação, ou um humano que conhece o histórico, é impossível dizer qual das três ramificações, se houver, o OP está mirando para remoção. Sem algumas informações externas que gitnão são mantidas automaticamente para você, git fetch -pé o mais próximo possível e qualquer método automático para literalmente tentar o que o OP pediu corre o risco de excluir muitas ramificações ou perder algumas que o OP faria de outra forma deseja excluir.

Também existem outros cenários, como se eu crie três ramificações separadas origin/Apara testar três abordagens diferentes de alguma coisa e depois origin/Adesapareça. Agora eu tenho três ramificações, que obviamente não podem corresponder ao nome, mas foram criadas a partir de origin/A, portanto, uma interpretação literal da questão dos OPs exigiria a remoção das três. No entanto, isso pode não ser desejável, se você puder encontrar uma maneira confiável de combiná-los ...

Twalberg
fonte
108
Isso não exclui os ramos locais, somente os ponteiros remotos para os ramos
Jaap
4
Exclui apenas essas ramificações locais, que não existem no controle remoto E você nunca fez uma verificação delas.
Jarek Jakubowski
15
Você deve ler a pergunta com mais cuidado, como observa Jaap. As pessoas que votam nesta resposta também devem ler sobre o que realmente é a pergunta.
Søren Boisen
4
Sim, era exatamente isso que eu queria fazer! @ SørenBoisen Espero que, nos últimos dois anos, você tenha tido tempo de revisitar sua opinião ... Se o conteúdo publicado no SO sempre estiver relacionado apenas ao que os OPs às vezes realmente confusos pedem, removeremos muitas informações. Não pretenda instruir as pessoas sobre como elas podem usar este site, além das diretrizes oficiais, e elas claramente não impedem respostas ortogonais, mas úteis.
Félix Gagnon-Grenier
6
@ FélixGagnon-Grenier Aqui está o meu problema com esta resposta: 1) A pergunta é clara, OP claramente não está confuso. 2) Esta resposta não menciona que não responde à pergunta! 3) A pergunta já indica uma maneira de remover ramificações de rastreamento remoto que não existem mais, portanto agrega valor zero.
Søren Boisen
117

Isso excluirá as ramificações locais para as quais as ramificações de rastreamento remoto foram removidas. (Verifique se você está no masterramo!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

Detalhes:

  • git branch -vv exibe "ido" para ramificações locais que o controle remoto foi removido.

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dverificará se foi mesclado ( -Dserá excluído independentemente)

    error: The branch 'mybranch' is not fully merged.
    
wisbucky
fonte
16
Você pode até tornar o comando mais curto comgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg 30/07/2015
4
Apenas indique que você deve estar no mestre antes de fazer isso, porque git branch -dcompara ramos contra HEAD.
21815 Steve Bennett
Excelente! Eu olhei e procurei por isso. Eu gostaria de ter visto sua resposta antes de acabar descobrindo por conta própria. Isso teria me poupado alguns minutos. Aqui está a minha outra resposta: stackoverflow.com/questions/15661853/...
Karl Wilbur
1
Acabei com um alias de git semelhante, usado corte desde awk não funcionou por algum motivo:prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Zitrax
3
Oh cara ... esperto, você PRECISA atualizar sua resposta para dizer às pessoas que elas devem estar no mestre. Só fiz isso de um ramo diferente. @ stevebennet2 obrigado pelo comentário informativo
GrayedFox
53

Pode-se configurar o Git para remover automaticamente referências a ramificações remotas excluídas ao buscar:

git config --global fetch.prune true

Ao ligar git fetchou git pulldepois, as referências às ramificações remotas excluídas são removidas automaticamente.

wedesoft
fonte
5
isso não remove ramificações locais, apenas referências a elas, certo?
Clint Eastwood
@ClintEastwood Exclui apenas referências a ramificações remotas . Você pode listar referências a ramificações remotas usando git branch -r.
wedesoft
52

Há um pacote NPM limpo que faz isso por você (e deve funcionar em várias plataformas).

Instale-o com: npm install -g git-removed-branches

E, em seguida git removed-branches, mostrará todas as ramificações locais obsoletas e as git removed-branches --pruneexcluirá.

Mais informações aqui.

tzachs
fonte
1
Isso realmente deveria ter mais votos positivos. Obrigado por facilitar a vida, independentemente da plataforma.
Criptografia
Handy pequena extensão. Instalado e funcionou bem no Windows 10. Nota: ele considera as ramificações não mescladas como passíveis de remoção (erro ao executar --prune, embora a ramificação -d tenha sido chamada) .. elas são, no entanto, não indicadas como tal no inicial listagem mostrada.
user2864740 12/02
1
Esta é a minha resposta favorita. npx git-removed-branchesfunciona como um sonho.
Drazisil 01/03
sim! Isso deveria ter mais votos positivos! solução tão simples e intuitiva para o novato cli
geoseong 11/03
Seria útil fornecer uma visão geral do que a ferramenta está fazendo da perspectiva do git.
ryanwebjackson
41

Solução Windows

Para o Microsoft Windows Powershell:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

Explicação

git checkout master muda para o ramo principal

git remote update origin --prune ameixas ramos remotos

git branch -vvobtém uma saída detalhada de todos os ramos ( referência do git )

Select-String -Pattern ": gone]" obtém apenas os registros de onde foram removidos do controle remoto.

% { $_.toString().Split(" ")[0]} obter o nome do ramo

% {git branch -d $_} exclui a ramificação

chris31389
fonte
Belo exemplo. como alternativa git remote prune origin, use também select-string não parece corresponder à versão mais recente do git. Considere usarConvertFrom-String -TemplateContent
Bernie White
3
Parece que a versão mais recente do git adiciona alguns espaços finais, portanto o Split não funciona para obter o nome da ramificação. Faça .toString (). Trim (). Split ("") e ele será #
Chris Hynes
Aqui está o meu:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Omzig
@ Ommig O que isso faz de diferente? Você pode dar uma explicação>
chris31389 27/02/19
@ chris31389, eu tenho o pull lá para obter tudo o que está faltando no master, e mudei o branch para --merged e not master, quero ter certeza de que excluo apenas os --merged branches. Ela só me faz sentir melhor;)
Omzig
27

Ele listará as ramificações locais cuja ramificação de rastreamento remoto foi excluída do controle remoto.

$ git remote prune origin --dry-run

Se você deseja des-referenciar essas ramificações locais de local que não são rastreadas

$ git remote prune origin
027
fonte
19
Isso não responde à pergunta, é o que o OP já sabia.
Ken Williams
2
Também concordo, mas quando você pesquisa "Como remover ramificações de rastreamento local que não existem mais no controle remoto", este é o link principal e esta resposta corresponde ao título (não se alguém leu a descrição completa em questão), que é a razão da obtenção de votos :) #
027
Isso não remove as ramificações locais. Ainda há após a execução deste
Xin
@Xin tente executar o comando sem o argumento --dry-run, pois ele não executará o comando, mas mostrará o que ele mudará.
Torsten Ojaperv #
19

Como o @tzacks observa ... existe um pacote npm que é útil para isso. Apenas faça:

npx git-removed-branches --prune

(Eu teria comentado, mas não a reputação suficiente)

johnshew
fonte
1
Linda. Sem problemas qualquer. Fico feliz que esta foi uma resposta completa!
Dan Rayson 01/10/19
1
Isso deve estar no topo. Também funciona no Windows.
tomtastico
Isso é legal para JavaScript, e se você estiver fazendo Java puro?
GC_
14

Se você estiver usando o Windows e o Powershell, poderá usar o seguinte para excluir todas as filiais locais que foram mescladas na filial atualmente com check-out:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

Explicação

  • Lista a ramificação atual e as ramificações que foram mescladas a ela
  • Filtra a ramificação atual
  • Limpa todos os espaços iniciais ou finais da gitsaída para cada nome de filial restante
  • Exclui as ramificações locais mescladas

Vale a pena rodar git branch --mergedpor si só primeiro apenas para garantir que ele apenas remova o que você espera.

(Portado / automatizado em http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ .)

Mosquito
fonte
10

Linha única ainda mais curta e segura:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

Certifique-se de fazer o checkout para a ramificação que ainda não foi mesclada antes de executá-la. Porque você não pode excluir o ramo em que você está atualmente registrado.

FelikZ
fonte
3
isso também removerá seu 'mestre'?
dcsan
2
Se você atualmente verificado em mestre, em seguida, não, caso contrário, sim
FelikZ
1
Para pular mestre que você poderia apenas tubulação de grep e selecione o inverso, como assim - git branch -d $(git branch --merged | cut -c 3- | grep -v master)
mozillalives
Esta é inseguro e alguém no futuro vai inconscientemente excluir seu mestre ramo
jasonseminara
1
@jasonseminara #dcsan Atualizei o snippet para ignorar o ramo principal. #mozillalives obrigado
FelikZ
9

Eu queria algo que limpasse todas as ramificações locais que estavam rastreando uma ramificação remota origin, onde o ramo remoto foi excluído ( gone). Eu não queria excluir ramificações locais que nunca foram configuradas para rastrear uma ramificação remota (ou seja: minhas ramificações locais de desenvolvimento). Além disso, eu queria um one-liner simples que apenas usasse git, ou outras ferramentas CLI simples, em vez de escrever scripts personalizados. Acabei usando um pouco de grepe awkpara fazer esse comando simples, depois o adicionei como um alias no meu ~/.gitconfig.

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

Aqui está um git config --global ...comando para adicionar isso facilmente como git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

NOTA: O uso da -Dbandeira git branchpode ser muito perigoso. Portanto, no comando config acima, uso a -dopção em git branchvez de -D; Eu uso -Dna minha configuração real. Uso -Dporque não quero ouvir o Git reclamar de galhos imersos, só quero que eles desapareçam. Você também pode querer essa funcionalidade. Nesse caso, basta usar em -Dvez de -dno final desse comando de configuração.

Karl Wilbur
fonte
8

Para remover ramificações remotas:

$git remote prune origin

Para remover ramificações locais que já foram mescladas:

$git branch -D $(git branch --merged)
Aniket
fonte
Funciona para mim. Obrigado.
AndroidRuntimeException
2
(git branch --merged) também retorna 'master' para mim. E outros ramos que não foram excluídos no controle remoto.
Tom G
8
Isso excluiu meu ramo principal.
Greg
@ Greg Apenas localmente, certo?
GC_
5

Não parece haver uma linha segura, muitos casos extremos (como um ramo que tenha "mestre" como parte do nome, etc.). Mais seguras são estas etapas:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. visualize o arquivo e remova linhas dos ramos que você deseja manter (como ramo principal!); você não precisa editar o conteúdo de nenhuma linha
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d
Oliver
fonte
5

Com base nas respostas acima, estou usando este forro mais curto:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

Além disso, se você já tiver podado e tiver galhos pendentes locais, isso os limpará:

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d
hidralisk
fonte
1
Não funciona se os seus nomes de ramo têm uma /neles
theicfire
4

não sabe como fazer tudo de uma vez, mas o git git branch -d <branchname>excluirá SOMENTE uma ramificação local se ela for completamente mesclada. Observe as letras minúsculas d.

git branch -D <branchname> (observe a letra D maiúscula) excluirá uma filial local, independentemente de seu status mesclado.

NHDaly
fonte
No Windows, as outras respostas não funcionaram para mim. O uso desta resposta com a opção -D simples (mesmo que o ramo já tenha sido "excluído").
Podemos fazer isso para todos os ramos de uma só vez?
Teoman shipahi
3

Você pode usar este comando:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

Git Clean: Excluir ramificações já mescladas, incluindo quebra de comando

sendon1982
fonte
Você realmente não precisa filtrar nenhuma ramificação (ex master). Se é "colada", então isso significa apenas que vai remover a cópia local, mas "git checkout dev" irá criar uma filial local do remoto se já não estiver presente
csga5000
Mas a lista de filiais locais ainda está lá, mesmo se forem mescladas. Este comando é para remover esses ramos que foram excluídos do controle remoto.
sendon1982
asterisco na primeira posição significa ramificação atual, quando você executar esse comando em diferentes ramo não funcionará bem
OzzyCzech
2

Com base nas respostas acima, vim com esta solução de uma linha:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
Gagarwal
fonte
2

Usando uma variante da resposta do @ wisbucky, adicionei o seguinte como um alias ao meu ~/.gitconfigarquivo:

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

Com isso, um simples git pruneitgoodlimpará as ramificações locais e remotas que não são mais necessárias após as mesclagens.

Ken Williams
fonte
2

A versão Powershell de git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

Isso removerá quaisquer ramificações locais que foram mescladas no mestre, enquanto você estiver no ramo mestre .

git checkout master para trocar.

Kevin George
fonte
1

A variante de Schleis não funciona para mim (Ubuntu 12.04), então deixe-me propor minhas variantes (claras e brilhantes :):

Variante 1 (eu preferiria esta opção):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

Variante 2:

uma. Funcionamento a seco:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

b. Remova ramificações:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D
daniilyar
fonte
1

A seguir, é apresentada uma adaptação da resposta do @ wisbucky para usuários do Windows:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

Eu uso o posh-git e, infelizmente, o PS não gosta de nus for, então criei um script de comando simples chamado PruneOrphanBranches.cmd:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

Chame-o sem parâmetros para ver uma lista e, em seguida, chame-o com "-d" para executar a exclusão real ou "-D" para quaisquer ramificações que não sejam totalmente mescladas, mas que você deseja excluir de qualquer maneira.

Sam C
fonte
Isto não funcionou para mim, de alguma forma o :ou : (com um espaço) no findstrcausou a combinar tudo cada vez - eu quase eliminado mestre. No entanto, o uso de uma regex funcionou bem:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Josh
1

Tente isso no git bash, para buscar e remover referências a ramificações excluídas e depois remover as ramificações locais que estavam rastreando as ramificações removidas:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

Lembre-se de fazer o checkout primeiro de um ramo que não será excluído, para que não bloqueie a exclusão do ramo.

Guillermo Gutiérrez
fonte
0

Transformei a resposta aceita em um script robusto. Você o encontrará no repositório git-extensions .

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>
Ingo Karkat
fonte
0

Cheguei a esta página buscando a resposta para "como faço para excluir ramificações com check-out local que não têm mais ramificação upstream"

Também não me importei se a ramificação local ainda não havia sido mesclada, pois a canalização git branch -dsimplesmente avisará em vez de excluir ramificações locais não imersas.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff
Meredith
fonte
0

Em Powershell :

git branch -D (git branch --merged |% { $_.trim() } )
Raúl Salinas-Monteagudo
fonte
0

Aqui está a minha solução:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p é remover todas as referências de rastreamento remoto que não existem mais no controle remoto. Portanto, o primeiro passo removerá referências a ramificações remotas.

  • -vv é para mostrar sha1 e confirmar a linha de assunto para cada cabeçalho, juntamente com o relacionamento com o ramo upstream (se houver). A segunda etapa obterá todos os ramos locais e o comando grep filtrará os ramos que foram excluídos.

Neeraj Bansal
fonte
Ainda menor (como descrito em outro comentário)git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
mrroboaat
-2

Exclua qualquer filial que não esteja atualizada com o mestre

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null
Jason Waldrip
fonte
-3

Tenho certeza de que git remote prune originé isso que você quer.

Você pode executá-lo git remote prune origin --dry-runpara ver o que faria sem fazer alterações.

Jason Antman
fonte
12
Na verdade, isso não remove o próprio ramo local.
Taytay
-16

Usando a GUI? Procedimento manual, mas rápido e fácil.

$ git gui

Selecione "Filial -> Excluir". Você pode selecionar várias ramificações com a tecla Ctrl (Windows) e remover todas elas.

Pedro Ballesteros
fonte
É engraçado o quão negativa essa resposta está sendo percebida. Abordagem totalmente válida IMO se você gosta de GUI.
serraosays