Normalmente, eu não responderia a uma pergunta que já tem 16 respostas, mas todas as outras respostas estão erradas e a resposta certa é muito simples. A pergunta diz: "Existe uma maneira simples de excluir todas as ramificações de rastreamento cujo equivalente remoto não existe mais?"
Se "simples" significa excluir todos eles de uma só vez, não frágeis, não perigosos e sem depender de ferramentas que nem todos os leitores terão, a resposta certa é: não.
Algumas respostas são simples, mas elas não fazem o que foi solicitado. Outros fazem o que foi solicitado, mas não são simples: todos contam com a análise da saída do Git por meio de comandos de manipulação de texto ou linguagens de script, que podem não estar presentes em todos os sistemas. Além disso, a maioria das sugestões usa comandos de porcelana, cuja saída não é projetada para ser analisada por script ("porcelana" refere-se aos comandos destinados à operação humana; os scripts devem usar os comandos "encanamento" de nível inferior).
Leitura adicional:
Se você quiser fazer isso com segurança, no caso de uso em questão (ramificações de rastreamento de coleta de lixo que foram excluídas no servidor, mas ainda existem como ramificações locais) e apenas com comandos de alto nível Git, é necessário
git fetch --prune
(ou git fetch -p
, que é um alias, ou git prune remote origin
que faz a mesma coisa sem buscar e provavelmente não é o que você deseja na maioria das vezes).
- Observe todas as ramificações remotas relatadas como excluídas. Ou, para encontrá-los mais tarde,
git branch -v
(qualquer ramo de rastreamento órfão será marcado como "[foi]").
git branch -d [branch_name]
em cada ramo de rastreamento órfão
(que é o que algumas das outras respostas propõem).
Se você deseja criar um script para uma solução, então for-each-ref
é o seu ponto de partida, como na resposta de Mark Longair aqui e nesta resposta a outra pergunta , mas não consigo encontrar uma maneira de explorá-la sem escrever um loop de script de shell ou usar xargs ou algo assim .
Explicação em segundo plano
Para entender o que está acontecendo, você precisa entender que, na situação de rastrear ramificações, você não tem uma ramificação, mas três. (E lembre-se de que "ramificação" significa simplesmente um ponteiro para uma confirmação.)
Dada uma ramificação de rastreamento feature/X
, o repositório remoto (servidor) terá essa ramificação e a chamará feature/X
. Seu repositório local possui uma ramificação remotes/origin/feature/X
que significa "Isso foi o que o controle remoto me disse sobre sua ramificação de recursos / X, da última vez que conversamos" e, finalmente, o repositório local possui uma ramificação feature/X
que aponta para sua confirmação mais recente e está configurada para "track" remotes/origin/feature/X
, o que significa que você pode puxar e empurrar para mantê-los alinhados.
Em algum momento, alguém excluiu feature/X
o controle remoto. A partir desse momento, você fica com o seu local feature/X
(o que provavelmente não quer mais, pois o trabalho no recurso X provavelmente está concluído) e o seu remotes/origin/feature/X
com certeza é inútil, pois seu único objetivo era lembrar o estado da ramificação do servidor .
E o Git permitirá que você limpe automaticamente os redundantes remotes/origin/feature/X
- é o que git fetch --prune
faz - mas, por algum motivo, ele não exclui automaticamente os seus feature/X
... mesmo que você feature/X
ainda contenha as informações de rastreamento órfãs, ele tem as informações para identificar ramificações de rastreamento anteriores que foram totalmente mescladas. (Afinal, ele pode dar -lhe a informação que lhe permite fazer a operação com a mão mesmo.)
* master
no meu sistema. O seguinte comando funcionou para mim:git branch -d $(git branch --merged |tail -n +2)