Eu gostaria de limpar o meu repositório local, que tem uma tonelada de ramos velhos: por exemplo 3.2
, 3.2.1
, 3.2.2
, etc.
Eu estava esperando uma maneira sorrateira de remover muitos deles ao mesmo tempo. Como eles geralmente seguem uma convenção de liberação de pontos, pensei que talvez houvesse um atalho para dizer:
git branch -D 3.2.*
e mate todos os ramos 3.2.x.
Eu tentei esse comando e, é claro, não funcionou.
git branch -D $(git branch | grep 3.2*)
- isso funcionou para mim. Exclui os ramos cujo nome começa com "3.2".grep
- correspondência de padrões na saída (git branch
neste caso).$()
- significa executar e colocar o resultado.|
- encadeamento.-D
é uma exclusão forçada , devem usar-d
na maioria dos casos para serem mais seguros primeiro.Respostas:
Não com essa sintaxe. Mas você pode fazer assim:
Basicamente, o git branch excluirá várias ramificações para você com uma única invocação. Infelizmente, ele não conclui o nome do ramo. Embora, no bash, você possa:
fonte
git branch -D/-d
funciona bem para mim. Pode querer atualizar o seu (talvez do diretório mais recente do git.git contrib).git branch | ...
você poderia usar$(git for-each-ref --format='%(refname:short)' refs/heads/3.*)
. É mais longo, eu sei, mas é garantido que seja uma saída adequada, enquantogit branch
tem uma saída bonita com coisas como*
e->
(para symrefs) que podem atrapalhar você em scripts / one-liners.grep
alias para sempre incluir a bandeira--color=always
-git branch -D
estava jogandoerror: branch 'my_branch' not found.
até que eu corri sem a bandeira colorida.git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
git branch -D 3.2{,.1,.2}
para apagar todos os três ramos gnu.org/software/bash/manual/html_node/Brace-Expansion.htmlBem, no pior dos casos, você pode usar:
fonte
| xargs git branch -d
parte para verificar o que realmente será excluído.grep
a saída degit branch
, como destinada para leitura, não para análise. Pode mudar a qualquer momento. use ofor-each-ref
junto com os--format
parâmetros, conforme sugerido em outras respostas, e depois combine com as sugestões nesta resposta.EDITAR:
Uma versão mais segura (sugerida por Jakub Narębski e Jefromi), pois a saída do ramo git não deve ser usada no script:
... ou o xargs-free:
fonte
git branch
saída para scripts. Usegit for-each-ref
.git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
-D
é uma exclusão forçada , devem usar-d
na maioria dos casos para serem mais seguros primeiro.Você pode usar o git branch --list para listar os ramos elegíveis e o git branch -D / -d para remover os ramos elegíveis.
Um exemplo de revestimento:
fonte
error: branch 'package.json' not found.
. Parece que o * é expandido muito cedo e tenta excluir um ramo correspondente ao nome de cada arquivo e diretório.gitconfig
...git branch --list '3.2.*'
git branch -d (git branch --list '3.2.*').trim()
Recentemente, eu estava procurando a solução do mesmo problema, finalmente encontrei uma resposta e está funcionando muito bem:
Esta solução é incrível e, se você quiser uma explicação completa de cada comando e como ele está funcionando, é fornecido aqui .
fonte
Usar
fonte
alias grefs='git for-each-ref --format="%(refname:short)"'
para que eu possa então fazergrefs | grep 'regexpattern' | xargs git branch -D
Talvez você ache isso útil:
Se você deseja remover todos os ramos que não são, por exemplo, 'mestre', 'foo' e 'bar'
grep -v 'something' é um combinador com inversão.
fonte
-D
comparar opções com outras respostas Obrigado pela resposta aqui @Adi. Soluções funciona para mim.Coloquei minhas iniciais e um hífen (at-) como os três primeiros caracteres do nome do ramo por esse motivo exato:
fonte
Se você não estiver limitado a usar o prompt de comando git, sempre poderá executar
git gui
e usar o item de menu Filial-> Excluir. Selecione todos os ramos que você deseja excluir e deixe rasgar.fonte
Solução Powershell:
Se você estiver executando o Windows, poderá usar o PowerShell para remover várias ramificações de uma só vez ...
Você também pode ajustar como a correspondência de padrões deve funcionar usando o comando Select-String do Powershell. Dê uma olhada nos documentos do PowerShell .
fonte
Mantenha "desenvolver" e exclua todos os outros em locais
fonte
Fiz uma pequena função que pode ser útil com base na resposta fornecida por @ gawi (acima).
Adicione isso ao seu
.bash_profile
e reinicie seu terminal. Em seguida, você pode chamar da linha de comando da seguinte maneira:Nota
Atualmente, tenho a configuração para uma exclusão reversível, o que significa que não excluirá as ramificações, a menos que elas já tenham sido mescladas. Se você gosta de viver no limite, mude
-d
para-D
e ele excluirá tudo com o prefixo, independentemente!fonte
Se você realmente precisa limpar todos os seus galhos, tente
git branch -d $(git branch)
Ele excluirá todas as suas ramificações locais mescladas, exceto a que você está fazendo check-in.
É uma boa maneira de limpar seu local
fonte
Você pode gostar deste pequeno item ... Ele puxa a lista e solicita a confirmação de cada item antes de finalmente excluir todas as seleções ...
Use -D para forçar exclusões (como de costume).
Para facilitar a leitura, aqui está o que separamos linha por linha ...
aqui está a abordagem xargs ...
finalmente, eu gosto de ter isso no meu .bashrc
Dessa forma, eu posso apenas dizer
fonte
Para almas puras que usam o PowerShell aqui, o pequeno script
git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })
fonte
funciona corretamente para mim:
excluir todas as ramificações locais
fonte
Use o comando a seguir para remover todas as ramificações (a ramificação com check-out não será excluída).
Edit: Estou usando um Mac Os
fonte
Se você está no Windows, pode usar o PowerShell para fazer isso:
substitua
feature/*
por qualquer padrão que desejar.fonte
Você pode usar este comando:
git branch -D $(printf "%s\n" $(git branch) | grep '3.2')
fonte
Você pode usar
git gui
para excluir várias ramificações de uma só vez. Em Prompt de Comando / Bash ->git gui
-> Remoto -> Excluir ramificação ... -> selecione ramificações remotas que você deseja remover -> Excluir.fonte
Acabei de limpar um grande conjunto de filiais locais / remotas obsoletas hoje.
Abaixo está como eu fiz isso:
1. liste todos os nomes de ramificações em um arquivo de texto:
git branch -a >> BranchNames.txt
2. acrescente os ramos que desejo excluir ao comando "git branch -D -r":
git branch -D -r origem / dirA / branch01 origem / dirB / branch02 origem / dirC / branch03 (... acrescente quaisquer nomes de ramos)
3. execute o cmd
E este funciona muito mais rápido e confiável do que " git push origin --delete ".
Essa pode não ser a maneira mais inteligente, conforme listado em outras respostas, mas essa é bastante direta e fácil de usar.
fonte
Se você instalou a GUI do Git, que é um complemento padrão para Windows, é a mais simples. Você pode usar ctrl para escolher vários ramos e excluí-los com um clique.
fonte
Se você estiver usando o Fish shell, poderá aproveitar as
string
funções :Isso não é muito diferente das opções do PowerShell em algumas das outras respostas.
fonte
Se você tiver todos os ramos a serem excluídos em um arquivo de texto (ramos para del.txt) (um ramo por linha), poderá fazer isso para excluir todos os ramos do controle remoto (origem):
xargs -a branches-to-del.txt git push --delete origin
fonte
Para excluir várias ramificações com base em um padrão especificado, faça o seguinte:
Abra o terminal ou equivalente e digite os seguintes comandos:
Remova todas as ramificações 3.2.x, você precisa digitar
Isso é tudo!
Você está pronto para ir!
fonte
Como no Git, todas as ramificações não são nada por referências ao
.git/ref
repositório git, por que você não exclui as ramificações e, se algo deixado de fora que não é interessante no repositório será automaticamente coletado como lixo? precisa se preocupar.fonte
git branch -D <branchName>
fonte
Você pode remover todas as ramificações removendo todas as referências desnecessárias:
rm .git/refs/heads/3.2.*
fonte
git gc
). Não faça isso.