Quero ter meus repositórios locais e remotos sempre sincronizados em termos de ramificações.
Após uma revisão de solicitação de recebimento no GitHub, mesclo e removo minha ramificação (remota). Como eu poderia buscar essas informações no meu repositório local e pedir ao Git para remover minha versão local da ramificação também?
git ls-remote
egit show-ref
.git symbolic-ref
egit update-ref
.Respostas:
A maneira rápida
NB: se você não estiver ativo
master
, isso pode excluir o ramo. Continue lendo para o "caminho melhor".Certifique-se de manter o mestre
Você pode garantir que
master
, ou qualquer outra ramificação nesse sentido, não seja removida porgrep
mais. Nesse caso, você iria:Então, se quiséssemos manter
master
,develop
estaging
por exemplo, iríamos:Tornar este um alias
Como é um pouco longo, convém adicionar um alias ao seu
.zshrc
ou.bashrc
. O meu é chamadogbpurge
(paragit branches purge
):Em seguida, recarregue seu
.bashrc
ou.zshrc
:ou
fonte
branch
é um comando de porcelana e não um encanamento , preste atenção às alterações na interface do usuário nas versões futuras do Git que possam quebrá-lo.master
será excluída.grep -Ev '(\*|master|important-branch)'
~/.gitconfig
lugar, adicione o seguinte à[alias]
seção:gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
(não é necessário usar () na expressão grep).Eu uso o mesmo fluxo com o GitHub e não achei as respostas anteriores me satisfazendo, pois
git branch --merged
lista ramos que foram mesclados, mas nem todos foram removidos remotamente no meu caso. Então, isso funcionou para mim:git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Onde:
git fetch --all -p
: atualizar o status das filiais locaisgit branch -vv
: lista o status das filiais locaisgrep ": gone]"
: filtrar os excluídosawk '{ print $1 }'
: extrair seus nomesxargs -n 1 git branch -d
: passe o nome para o comando deleteNota: se preferir, você pode usar -D em vez de -d, o que impõe a exclusão.
Por exemplo:
Referência:
http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches
fonte
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
Grande roteiro e explicação, obrigado por que :)branch -vv
mostra a última mensagem de confirmação da ramificação. Se você tivesse "ido" nessa mensagem,grep gone
também atingiria esse ramo. Portanto,grep ": gone]"
é provavelmente um pouco mais seguro de usar.awk '$3 $4 ~ /:gone]$/ { print $1 }'
-D
vez-d
disso, é a resposta perfeita!experimentar:
que exclui sua ramificação local, se a ramificação remota correspondente for excluída.
Atualizada:
A afirmação acima não está correta.
Na verdade, a execução
git pull --prune
será só remover os ramos-monitoramento remoto , tais comoEm seguida, você pode executar
git branch -r
para verificar as ramificações de rastreamento remoto deixadas em sua máquina. Suponha que os ramos esquerdos sejam:o que significa que o ramo
origin/fff
é excluído.Então, depois de executar
git pull --prune
, basta executar:git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
você pode descobrir todas as filiais locais que:
então,
<the command above> | xargs git branch -d
pode excluir todos eles.fonte
--prune
sinalizador excluirá apenas ramificações de rastreamento remoto, não ramificações locais.git fetch --prune
, essa é a minha maneira de escolhagit pull --prune
resultou em "Você pediu para extrair do '--prune' remoto, mas não especificou uma ramificação. Como esse não é o controle remoto padrão configurado para sua ramificação atual, você deve especificar uma ramificação na linha de comando ".Isso deve funcionar para evitar a exclusão dos ramos mestre e de desenvolvimento com a solução aceita:
fonte
Para pessoas que usam o PowerShell, isso é equivalente à resposta acima :
git branch -D
cada uma das ramificações encontradasfonte
Nada disso estava funcionando para mim. Você pode ver minha outra resposta aqui: https://stackoverflow.com/a/34969726/550454
Mas, essencialmente, agora tenho isso no meu
~/.gitconfig
:fonte
Solução muito simples: remova seu repositório local e clone novamente o remoto. Pode não parecer muito elegante, mas é simples e você entenderá exatamente o que está fazendo sem ler as páginas de manual :-).
fonte
Eu escrevi este one-liner para listar todos os ramos locais que não têm ramo remoto correspondente:
Depois disso, é fácil excluir essas ramificações locais com
xargs
:fonte
master
, não funciona como esperado; seja cuidadosoEu apenas faço isso para remover as ramificações locais mescladas:
e caso você queira remover rastreamentos inexistentes também:
fonte
Se você acabou de enviar e mesclar sua ramificação para master, faça o seguinte no git bash:
Se você estiver nesse ramo, ele o levará de volta ao mestre. Neste ponto, faça um puxão com
fonte
A resposta votada tem o potencial de excluir o mestre. Considere o exemplo prático abaixo.
Eu tinha dois ramos de recursos hemen_README e hemen_BASEBOX que foram mesclados no desenvolvimento e, em seguida, o desenvolvimento foi mesclado no mestre. Os ramos do recurso hemen_README e hemen_BASEBOX foram excluídos remotamente, mas ainda estavam aparecendo localmente. Também não estou no mestre localmente, mas no desenvolvimento.
Nesse caso
Então, se eu executar o comando parcial acima
Observe que ele também mostra o mestre, que será excluído.
De qualquer forma, eu consegui. Estou compartilhando meu log de sessão com você sobre como consegui isso.
Acabei de verificar o que será podado e depois podado. olhando para o comando branch abaixo, cuidamos dos controles remotos
Agora vá em frente e exclua filiais locais
Bom agora os galhos são como desejado.
fonte