Com git remote prune origin
eu 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?
npx git-removed-branches
(execução a seco) ounpx git-removed-branches --prune
(de verdade). Você já precisa ter o node.js instalado. Veja as respostas abaixo para obter detalhes.Respostas:
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 comgit 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
bash
ouzsh
nã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
egrep
pela entrada padrão. E filtra as ramificações que possuem uma ramificação de rastreamento remoto (usandogit branch -vv
e filtrando as que possuemorigin
), 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
-d
opçã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áriogit branch -r
, ainda verá as ramificações remotas.fonte
git fetch -p
nem sempre é suficiente?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?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'
git branch -D
no final do comando funcionou melhor para nós, pois tendemos a esmagar os commits na mesclagem, o que geraThe branch x is not fully merged
erros ao executar com-d
.Se você deseja excluir todas as ramificações locais que já foram mescladas no mestre, você pode usar o seguinte comando:
Mais informações .
fonte
xargs -r git branch -d
para que nada seja executado se não houver ramificações a serem excluídas. Note que a-r
bandeira pode não estar disponível em todos os lugaresgit branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
git branch --merged master
lista 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 é executadagit branch -d
(excluir ramo) em cada um dos os resultados. Ou você pode apenas ler o link Mais informações fornecidas na resposta;)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.Entre as informações apresentadas por
git help fetch
, existe este pequeno item: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
A
eB
. Se eu clonar esse repo no meu sistema local, meu clone terá refs locais (ainda não são ramificações reais) chamadosorigin/A
eorigin/B
. Agora, digamos que eu faça o seguinte: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
A
eB
no repositório remoto e atualizo meu repositório local (git fetch
de alguma forma), o que faz com que meus representantes locaisorigin/A
eorigin/B
desapareçam. Agora, meu repo local tem três ramos ainda,A
,Z
, eC
. 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 chamadaB
na origem, não tenho como saber queZ
foi 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 quegit
nã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/A
para testar três abordagens diferentes de alguma coisa e depoisorigin/A
desapareça. Agora eu tenho três ramificações, que obviamente não podem corresponder ao nome, mas foram criadas a partir deorigin/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 ...fonte
Isso excluirá as ramificações locais para as quais as ramificações de rastreamento remoto foram removidas. (Verifique se você está no
master
ramo!)Detalhes:
git branch -vv
exibe "ido" para ramificações locais que o controle remoto foi removido.-d
verificará se foi mesclado (-D
será excluído independentemente)fonte
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
git branch -d
compara ramos contraHEAD
.prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Pode-se configurar o Git para remover automaticamente referências a ramificações remotas excluídas ao buscar:
Ao ligar
git fetch
ougit pull
depois, as referências às ramificações remotas excluídas são removidas automaticamente.fonte
git branch -r
.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 asgit removed-branches --prune
excluirá.Mais informações aqui.
fonte
npx git-removed-branches
funciona como um sonho.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 principalgit remote update origin --prune
ameixas ramos remotosgit branch -vv
obté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çãofonte
git remote prune origin
, use também select-string não parece corresponder à versão mais recente do git. Considere usarConvertFrom-String -TemplateContent
git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Ele listará as ramificações locais cuja ramificação de rastreamento remoto foi excluída do controle remoto.
Se você deseja des-referenciar essas ramificações locais de local que não são rastreadas
fonte
Como o @tzacks observa ... existe um pacote npm que é útil para isso. Apenas faça:
(Eu teria comentado, mas não a reputação suficiente)
fonte
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:
Explicação
git
saída para cada nome de filial restanteVale a pena rodar
git branch --merged
por 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/ .)
fonte
Linha única ainda mais curta e segura:
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.
fonte
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
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 usassegit
, ou outras ferramentas CLI simples, em vez de escrever scripts personalizados. Acabei usando um pouco degrep
eawk
para fazer esse comando simples, depois o adicionei como um alias no meu~/.gitconfig
.Aqui está um
git config --global ...
comando para adicionar isso facilmente comogit prune-branches
:NOTA: O uso da
-D
bandeiragit branch
pode ser muito perigoso. Portanto, no comando config acima, uso a-d
opção emgit branch
vez de-D
; Eu uso-D
na minha configuração real. Uso-D
porque 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-D
vez de-d
no final desse comando de configuração.fonte
Para remover ramificações remotas:
Para remover ramificações locais que já foram mescladas:
fonte
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:
git branch -vv | grep 'gone]' > stale_branches.txt
awk '{print $1}' stale_branches.txt | xargs git branch -d
fonte
Com base nas respostas acima, estou usando este forro mais curto:
Além disso, se você já tiver podado e tiver galhos pendentes locais, isso os limpará:
fonte
/
nelesnã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.fonte
Você pode usar este comando:
Git Clean: Excluir ramificações já mescladas, incluindo quebra de comando
fonte
Com base nas respostas acima, vim com esta solução de uma linha:
fonte
Usando uma variante da resposta do @ wisbucky, adicionei o seguinte como um alias ao meu
~/.gitconfig
arquivo:Com isso, um simples
git pruneitgood
limpará as ramificações locais e remotas que não são mais necessárias após as mesclagens.fonte
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.fonte
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):
Variante 2:
uma. Funcionamento a seco:
b. Remova ramificações:
fonte
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: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.
fonte
:
ou:
(com um espaço) nofindstr
causou 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\] "
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:
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.
fonte
Transformei a resposta aceita em um script robusto. Você o encontrará no repositório git-extensions .
fonte
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 -d
simplesmente avisará em vez de excluir ramificações locais não imersas.fonte
Em Powershell :
fonte
Aqui está a minha solução:
-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.
fonte
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Exclua qualquer filial que não esteja atualizada com o mestre
fonte
Tenho certeza de que
git remote prune origin
é isso que você quer.Você pode executá-lo
git remote prune origin --dry-run
para ver o que faria sem fazer alterações.fonte
Usando a GUI? Procedimento manual, mas rápido e fácil.
Selecione "Filial -> Excluir". Você pode selecionar várias ramificações com a tecla Ctrl (Windows) e remover todas elas.
fonte