Eu tenho um membro da equipe que inadvertidamente empurrou mais de 150 de suas filiais locais para o nosso repositório central. Felizmente, todos eles têm o mesmo prefixo. Usando esse prefixo, existe um comando git ou um pequeno shell script que eu possa usar que excluirá todos eles de uma só vez?
128
$ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
git branch -r | awk -F/ '/\/APR/{print $2}'
, você pode ver todos os nomes de filiais prefixados da APR listados?APR-04-DPH
ramo já foi excluído. Dê uma olhada nestas perguntas respondidas: isto e isto e também isso . As respostas para essas perguntas abordam o mesmo problema; você pode testar as soluções por conta própria.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Se você preferir uma abordagem mais simples, exclua 3 ou 4 ramos:
Importante: Funciona apenas no Git v1.7.0 e superior.
fonte
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Agradecimentos a Neevek pela excelente e elegante solução!
Mas tenho alguns problemas com barras nos nomes das filiais (estou usando o Git Flow), por causa do
awk
separador de campos/
(-F
opção)Portanto, minha solução se baseia na de Neevek , mas analisa corretamente os nomes dos ramos
/
. Nesse caso, presumo que seu controle remoto tenha sido chamadoorigin
. Comando para excluir ramificações remotas com nomes marcados comPATTERN
:E não se esqueça de verificar o que você vai excluir:
DICA ÚTIL: Se os nomes de sua filial (sem
origin/
prefixo) armazenados em um arquivo de texto (um nome de filial por linha), basta executar:fonte
xargs -a file -L
vez decat file | xargs
. Ainda mais simplesxargs -a file git push --delete origin
.Esta pode ser uma resposta duplicada, mas abaixo testada e funcionou perfeitamente para mim.
git branch -D backticks $ (git branch --list 'feature / *' backticks )
fonte
O mesmo com o grep:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
mostraorigin/prefix/branchname
. Então vai demorarprefix/branchname
.fonte
xargs -I {} git push origin :{}
, não-i
.-i
pois usa a substituição padrão para,{}
mas-I
você pode declarar a sua própria. ... acabei de encontrar no manual:-i ... the same as -I{}
A solução da Neevek é elegante, mas pode ser melhor: a solução proposta chama de 'git push' uma vez por filial, o que significa que um ida e volta da rede adicional por filial será excluído. Como você está usando o awk de qualquer maneira, por que não usá-lo para prefixar o ':' e o xargs pode chamar 'git push' exatamente uma vez e excluir todos os ramos de uma só vez:
Execute a seco para listar as ramificações que seriam excluídas:
Solução final para realmente enviar as exclusões:
fonte
xargs: replstr may not be empty
com a solução de Neevek, talvez versão git ..git version 1.9.5
Mas isso funcionou muito bem para mim. Obrigado a vocês doisrecurso https://coderwall.com/p/eis0ba
fonte
Graças a Steve e Neevek, encontrei uma solução que funcionou muito bem para mim e achei que valeria a pena compartilhar:
A solução de Steve funcionou para mim com um pequeno ajuste. Meus controles remotos foram nomeados,
origin/feature/some-feature-name
então eu aparei o seuawk
:Agora está fazendo um bom fluxo de exclusão:
Fiquei imaginando se alguém tinha alguma idéia para uma solução mais elegante, porém, que pudesse gerar algo assim (meu script CLI é muito ruim, por isso levaria um tempo para descobrir isso):
Isso resultaria em uma única saída agradável com uma solicitação de rede:
fonte
Graças a Neevek. Isso funcionou bem depois de reconfigurá-lo para o meu propósito:
Eu também precisava levar em conta a estrutura da pasta. Meus ramos de recursos estão em uma estrutura de pastas como origem / recurso / PREFIX-FEATURENUMBER. Então, eu tive que construir meu padrão a partir de $ 2 = pasta + $ 3 = branchname.
fonte
Todo mundo está usando
awk
, não sei por quê. Eu sinto que isso é mais complexo. Aqui está o que eu uso para excluir todas as ramificações remotas no meufork
controle remoto:Jogue
grep
entrexargs
esed
se você precisar filtrar a lista para baixo apenas para um subconjunto de ramificações remotas.fonte
origin/blaprefix_anotherbla
. Mas usarsed
lidou bem com isso. Outra vantagem dessa abordagem é que eu uso o bitbucket e não preciso inserir a senha de autenticação para cada exclusão de ramificação manualmente. Este exclui todas as ramificações em um único lote.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Sei que isso é para o comando git, mas se você estiver procurando por uma solução alternativa para obter o mesmo resultado:
Você pode fazer isso aqui (Git Remove Remote Branches):
Em seguida, selecione os ramos que você deseja:
Verifique se você tem permissões para remover as ramificações remotas.
fonte
O Github também possui uma interface de usuário e um mecanismo agradáveis para excluir ramificações rapidamente, ou seja, se você preferir usar uma interface de usuário
fonte
Tentei excluir todas as ramificações remotas origin / release / r1-1 *, portanto, a linha de comando a seguir funcionou bem.
fonte
Não pude usar o awk porque estamos usando uma estrutura de barra para o nome de nossas filiais.
Isso obtém toda ramificação remota, obtém apenas a de um único usuário, remota a string "origin /" e executa uma exclusão em cada uma delas.
fonte
Funcionamento a seco:
Exclua ramificações remotas:
Exclua apenas ramificações remotas totalmente mescladas:
Explicação:
sed "s/origin\///"
irá removerorigin/
do nome do ramo. Sem tirar isso, consegui:remote ref does not exist
fonte
As respostas anteriores me ajudaram a remover todas as ramificações de lançamento a partir de 2018. Eu executei isso no prompt de comando do Windows 10. Eu instalei o clink , então os comandos do Linux funcionam para mim.
Funcionamento a seco:
Se o funcionamento a seco mostrar galhos que não estão remotos / de origem. Execute o comando git prune abaixo para corrigir e verificar novamente.
Exclua assim que estiver satisfeito com o resultado acima:
Se você ver:
error: unable to delete 'release-...2018': remote ref does not exist
. Em seguida, execute o comando de remoção anterior e tente novamente.fonte
Aviso: Isso excluirá todas as ramificações remotas. Use com cuidado.
Eu acho que a minha maneira de excluir filiais remotas é a melhor.
Aviso: Isso excluirá todas as ramificações remotas. Use com cuidado.
fonte