Problema: desejo uma maneira de excluir todas as filiais locais que possuo e que não possuem um controle remoto. É fácil canalizar os nomes das ramificações em um git branch -D {branch_name}
, mas como faço para obter essa lista em primeiro lugar?
Por exemplo:
Eu crio uma nova filial sem um controle remoto:
$ git co -b no_upstream
Eu listo todos os meus branches, e há apenas um com controle remoto
$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master
Que comando posso executar para obter no_upstream
uma resposta?
Posso correr git rev-parse --abbrev-ref --symbolic-full-name @{u}
e isso vai mostrar que não tem controle remoto:
$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Mas como isso é um erro, ele não me deixa usá-lo ou canalizá-lo para outros comandos. Pretendo usar isso como um alias de script de shell git-delete-unbranched
ou talvez fazer um Gem super simples comogit-branch-delete-orphans
fonte
Respostas:
Recentemente, descobri
git branch -vv
qual é a versão "muito detalhada" dogit branch
comando.Ele produz as ramificações junto com as ramificações remotas, se houver, no seguinte formato:
Depois de ter essa saída bem formatada, é tão fácil quanto canalizá-la
cut
eawk
obter sua lista:Resulta na seguinte saída:
A
cut
parte apenas normaliza os dados removendo os primeiros dois caracteres (incluindo*
) da saída antes de passá-los paraawk
.A
awk
parte imprime a primeira coluna se não houver colchete na terceira coluna.Bônus: crie um alias
Facilite a execução criando um alias em seu
.gitconfig
arquivo global (ou onde quer que seja):Importante: A barra invertida precisa ser escapada no alias ou então você terá um arquivo gitconfig inválido.
Bônus: Filtragem Remota
Se por algum motivo você tiver vários controles remotos de rastreamento para ramos diferentes, é fácil especificar com qual controle remoto você deseja verificar. Basta anexar o nome remoto ao padrão awk. No meu caso, é
origin
para que eu possa fazer isso:fonte
WIP:
mesmo ..? não é isso que um comando stash cria ..?git branch -vv
, mesmo que exista um branch remoto e corresponda ao meu branch local, não veria ao[origin/branch-name]
lado do resultado. Tive dediff
duas listas de ramos para descobrir o que era apenas local.git branch -vv | grep -v origin/
é o suficiente para mimgone
?git branch
(sem nenhuma opção) lista apenas branches locais, mas você não sabe se eles estão rastreando um branch remoto ou não.Normalmente, esses branches locais devem ser excluídos assim que mesclados
master
(como visto nesta edição do git-sweep ):Isso não é tão completo quanto você deseja, mas é um começo.
fonte
git branch -a --merged
.Eu tenho um problema semelhante. Quero remover todas as filiais locais que estavam rastreando filiais remotas que agora foram excluídas. Estou achando que
git remote prune origin
foi insuficiente para remover os galhos que quero que vão. Depois que o controle remoto for excluído, quero que o local também seja removido. Aqui está o que funcionou para mim:Do meu
~/.gitconfig
:Aqui está um
git config --global ...
comando para adicionar isso facilmente comogit prune-branches
:NOTA : mudei o
-d
para-D
na minha configuração real, porque não quero ouvir Git reclamar de branches não mesclados. Você pode querer esta funcionalidade também. Nesse caso, basta usar em-D
vez de-d
no final desse comando.Além disso, FWIW, seu arquivo de configuração global quase sempre seria
~/.gitconfig
.(OS X Fix)
Conforme está escrito, isso não funciona no OS X por causa do uso de
xargs -r
(obrigado, Korny ).O
-r
é para evitar quexargs
seja executadogit branch -d
sem um nome de branch, o que resultará em uma mensagem de erro "fatal: branch name required
". Se você não se importar com a mensagem de erro, pode simplesmente remover o-r
argumento dexargs
e está tudo pronto.No entanto, se você não quiser ver uma mensagem de erro (e realmente, quem poderia culpá-lo), você precisará de outra coisa que verifique se há um cano vazio. Se você puder usar ifne de moreutils . Você inseriria
ifne
antesxargs
, o que deixaráxargs
de funcionar com dados vazios. NOTA :ifne
considera que nada está vazio, isso inclui linhas em branco, então você ainda pode ver essa mensagem de erro. Eu não testei isso no OS X.Aqui está essa
git config
linha comifne
:fonte
Edição tardia:
Melhor é
No GNU / qualquer coisa
Se mais de um punhado de branches fosse provável, haveria maneiras melhores de usar
comm -23
na saída degit branch|sed|sort
egit config -l|sed|sort
.fonte
Isso funciona para mim:
git branch -vv | grep -v origin
(se o nome do seu controle remoto não for de origem, substitua-o).
Isso listará todos os branches que não estão rastreando um controle remoto, o que parece ser o que você está procurando.
fonte
git fetch --prune
.Eu sintetizo meu próprio comando Git para obter os
origin/***: gone
branches:git remote prune origin && git branch -vv
irá imprimir ramos em modo detalhado.cut -c 3-
removerá os primeiros caracteres.grep ': gone]'
irá imprimir apenas os ramos remotos que já não existem.awk '{print $1}'
irá imprimir o nome do ramo.xargs -n1 -r echo git branch -d
irá imprimir ogit branch -d
comando para remover ramificações (-n1 irá gerenciar um comando por vez, -r para evitar a emissão de comandos se nenhuma ramificação estiver presente).SUGESTÃO: remova o comando "echo" para executar os comandos em vez de imprimir apenas, deixei isso no comando para verificar os comandos antes de emitir para o git.
SUGESTÃO 2: problema
git branch -D
se e somente se você tiver certeza que deseja remover ramos não mescladosfonte
awk
, não sabia que você poderia fazer isso.Aqui está algo que usei no PowerShell com comentários para explicar o que ele está fazendo. Na tentativa de deixar claro o que está acontecendo, não usei nenhum comando abreviado do PowerShell (aliases). Sinta-se à vontade para compactá-lo no nível desejado de criptografia :)
fonte
Combinando algumas das respostas existentes:
Por exemplo:
fonte
Nenhuma das respostas existentes parece funcionar para mim.
Esta é minha solução para listar branches locais que não são remotos
E aqui está uma explicação de como funciona:
Considere a lista de todos os ramos remotos (sem 'origem /' ou espaços iniciais)
git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-
Considere a lista de todos os ramos locais (sem asteriscos ou espaços à esquerda)
git branch | cut -c 3-
Compare essas duas listas e me mostre qualquer coisa na lista 2 (meus ramos locais) que não esteja na lista 1 (a lista de ramos remotos)
comm -13 <(git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-) <(git branch | cut -c 3-)
fonte