Sigo um processo de desenvolvimento em que crio uma nova filial local para cada novo recurso ou cartão de história. Quando terminar, mesclo o ramo no mestre e empurro.
O que tende a acontecer com o tempo devido a uma combinação de preguiça ou esquecimento é que acabo com uma grande lista de filiais locais, algumas das quais (como picos) podem não ter sido mescladas.
Eu sei como listar todos os meus ramos locais e sei como remover um único ramo, mas queria saber se havia um comando git que me permita excluir todos os meus ramos locais?
Abaixo está a saída do git branch --merged
comando.
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Todas as tentativas de excluir ramificações listadas com grep -v \*
(conforme as respostas abaixo) resultam em erros:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
Estou usando:
git 1.7.4.1
ubuntu 10.04
GNU bash, versão 4.1.5 (1) -release
GNU grep 2.5.4
Respostas:
O subcomando 'git branch -d' pode excluir mais de um ramo. Então, simplificando a resposta do @ sblom, mas adicionando um xargs crítico:
ou, ainda mais simplificado para:
Importante, como observado por @AndrewC, usar
git branch
de scripts é desencorajado. Para evitá-lo, use algo como:Cuidado garantido em exclusões!
fonte
error:branch 'STORY-123-Short-Description' not found.
para cada uma das ramificações listadas.error:branch 'STORY-123-Short-Description' not found.
erro, isso provavelmente ocorre devido às configurações de cores do git. Isso funcionou para mim (note a--no-color
opção):git branch --no-color --merged | grep -v \* | xargs git branch -D
Encontrei uma maneira melhor em um comentário sobre esse problema no github :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
edit: opção sem cor adicionada e exclusão de ramificação estável (adicione outras ramificações conforme necessário no seu caso)
fonte
error: branch 'my-branch-name' not found.
para cada ramo. Usando a versão 1.8.3.4 do git (Apple Git-47). Alguma idéia do porquê?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
A análise da saída de
git branch
não é recomendada e não é uma boa resposta para futuros leitores no Stack Overflow.git branch
é o que é conhecido como comando de porcelana. Os comandos de porcelana não foram projetados para serem analisados pela máquina e a saída pode mudar entre diferentes versões do Git.git branch
uma maneira que dificulta a análise (por exemplo, colorização). Se um usuário configuroucolor.branch
, você receberá códigos de controle na saída, o que levará a issoerror: branch 'foo' not found.
se você tentar canalizá-lo para outro comando. Você pode ignorar isso com o--no-color
sinalizador paragit branch
, mas quem sabe quais outras configurações de usuário podem quebrar as coisas.git branch
pode fazer outras coisas que são irritantes para analisar, como colocar um asterisco ao lado da ramificação com check-out atualmenteO mantenedor do git tem a dizer sobre scripts em torno da
git branch
saídaRespostas que sugerem a edição manual de arquivos no diretório
.git
diretório (como .git / refs / heads) são igualmente problemáticas (as refs podem estar em .git / embal-refs ou o Git pode alterar seu layout interno no futuro).Git fornece o
for-each-ref
comando para recuperar uma lista de ramificações.O Git 2.7.X apresentará a
--merged
opção para que você possa fazer algo como o abaixo para encontrar e excluir todos os ramos mescladosHEAD
Git 2.6.X e mais antigo, você precisará listar todas as ramificações locais e testá-las individualmente para verificar se elas foram mescladas (o que será significativamente mais lento e um pouco mais complicado).
fonte
git branch --no-color 2>/dev/null
?git branch
um comando de porcelana, e não há garantia de que a saída não seja alterada em alguma versão futura do git.A maneira mais simples de excluir todas as ramificações, mas mantendo outras como "develop" e "master" é a seguinte:
muito útil !
fonte
Para excluir todas as ramificações, exceto a que você fez check-out no momento:
Eu recomendaria mudar
git branch -D $b
paraecho $b
as primeiras vezes para garantir que ele exclua os ramos que você pretende.fonte
error:branch 'a_branch_name' not found.
eu posso ver o que você está tentando fazer e eu fui brincar com o comando, mas por algum motivo git não parece como os nomes do ramo fornecido ...git branch --merged
STORY-123-Short-Description
git branch --merged
, você recebe uma lista com um desses em cada linha?error:branch 'a_branch_name' not found.
? Ou se queixa de um dos nomes de ramificação da suagit branch
saída acima?O comando abaixo excluirá todos os ramos locais, exceto o ramo mestre.
O comando acima
fonte
git branch | grep -v "master" | xargs git branch -d
primeiro para não excluir ramos não imersos, apenas para garantir. Mas boa resposta!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Apenas uma observação, eu atualizaria para o git 1.7.10. Você pode estar recebendo respostas aqui que não funcionarão na sua versão. Meu palpite é que você teria que prefixar o nome do ramo
refs/heads/
.CUIDADO, continue com o seguinte apenas se tiver feito uma cópia da sua pasta de trabalho e do diretório .git.
Às vezes, apenas vou em frente e apago os ramos dos quais não quero diretamente
.git/refs/heads
. Todas essas ramificações são arquivos de texto que contêm os 40 caracteres sha-1 da confirmação para a qual apontam. Você terá informações estranhas no seu,.git/config
se você tiver configurado um rastreamento específico para qualquer um deles. Você pode excluir essas entradas manualmente também.fonte
Experimente o seguinte comando shell:
Explicação:
git branch | grep -v "master"
comandoxargs
comandoxargs git branch -D
fonte
Para excluir todas as filiais locais no linux, exceto a que você está
fonte
Achei mais fácil usar apenas o editor de texto e o shell.
git checkout <TAB>
shell. Mostrará todas as filiais locais.git branch -D <PASTE THE BRANCHES NAMES HERE>
.É isso aí.
fonte
Eu tive um tipo semelhante de situação e recentemente achei o seguinte comando útil.
Se você deseja manter várias ramificações,
espero que isso ajude alguém.
fonte
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
verdade, acho que você os tinha originalmente, mas eles se perderam na formatação SO.Na Linha de Comando do Windows, exclua todos, exceto o ramo com check-out atual usando:
fonte
Se você não precisar passar pelo próprio Git, também poderá excluir as cabeças em .git / refs / heads manualmente ou programaticamente. O seguinte deve funcionar com ajustes mínimos no Bash:
Isso excluirá todas as ramificações locais, exceto a ramificação principal. Como suas ramificações upstream são armazenadas em .git / refs / remotes , elas permanecem intocadas.
Se você não está usando o Bash, ou deseja recolocar muitos repositórios Git de uma só vez, pode fazer algo semelhante com o GNU find:
A solução de localização é provavelmente mais portátil, mas caminhos de remoção e nomes de arquivos são complicados e potencialmente mais propensos a erros.
fonte
Nenhuma das respostas atendeu totalmente minhas necessidades, então vamos lá:
Isso excluirá todas as ramificações locais que são mescladas e iniciadas com
feature/
,bugfix/
ouhotfix/
. Posteriormente, o controle remotoorigin
é removido (talvez seja necessário digitar uma senha).Funciona no Git 1.9.5.
fonte
Com base em uma combinação de várias respostas aqui - se você deseja manter todas as ramificações existentes no controle remoto, mas excluir as demais , o seguinte oneliner fará o truque:
fonte
Embora essa não seja uma solução de linha de comando, estou surpreso que a GUI do Git ainda não tenha sido sugerida.
Eu uso a linha de comando 99% do tempo, mas, neste caso, é muito lento (daí a pergunta original), ou você não sabe o que está prestes a excluir ao recorrer a uma manipulação de shell longa e inteligente.
A interface do usuário resolve esse problema, pois você pode rapidamente desmarcar as ramificações que deseja remover e lembrar as que deseja manter, sem precisar digitar um comando para cada ramificação.
Na interface do usuário, vá para Ramificação -> Excluir e Ctrl + Clique nas ramificações que deseja excluir para que elas sejam destacadas. Se você quiser ter certeza de que eles estão mesclados em uma ramificação (como
dev
), em Excluir apenas se mesclado em, defina Ramificação local comodev
. Caso contrário, defina-o como Sempre para ignorar esta verificação.fonte
Para o PowerShell, isso funcionará:
fonte
O script a seguir exclui ramificações. Use-o e modifique-o por sua conta e risco, etc. etc.
Com base nas outras respostas desta pergunta, acabei escrevendo um script bash rápido para mim. Eu chamei de "gitbd" (git branch -D), mas se você usá-lo, poderá renomeá-lo para o que quiser.
Ele oferecerá a exclusão de quaisquer ramificações que correspondam a um argumento padrão, se passadas, ou todas as ramificações locais quando chamadas sem argumentos. Também fornecerá uma etapa de confirmação, já que, você sabe, estamos excluindo coisas, então isso é legal.
É meio idiota - se não há galhos que correspondam ao padrão, ele não percebe.
Um exemplo de execução de saída:
fonte
Escrevi um script de shell para remover todos os ramos locais, exceto
develop
fonte
As respostas acima funcionam bem. Aqui está outra abordagem quando temos muitas ramificações no repositório local e temos que excluir muitas ramificações, exceto algumas que estão na máquina local.
Primeiro
git branch
, listará todas as ramificações locais.Para transpor a coluna de nomes de ramificação para uma única linha no arquivo, executando um comando unix
git branch > sample.txt
Isso o salvará no arquivo sample.txt . E execute o
awk 'BEGIN { ORS = " " } { print }' sample.txt
comando no shell. Isso transformará a coluna em linha e copiará a lista de nomes de ramificações em uma única linha.
E então corra
git branch -D branch_name(s)
.Isso excluirá todos os ramos listados presentes no local
fonte
A maneira mais pragmática: verifique se você não possui trabalho não
master
comprometido, confirme / envie, se necessário, clone uma nova cópia do repositório e exclua a antiga.fonte
Para esse fim, você pode usar git-extras
fonte
Eu não tenho grep ou outro unix na minha caixa, mas isso funcionou no terminal do VSCode:
git branch -d $(git branch).trim()
Eu uso o d minúsculo para que ele não exclua ramificações não imersas.
Eu também estava no master quando o fiz, por
* master
isso não existe e não tente excluir o master.fonte
master
, este comando será excluídomaster
.Certifique-se de fazer isso primeiro
Depois de ter todas as informações de ramificações remotas, use o comando a seguir para remover todas as ramificações, exceto as mestre
fonte