git delete remotes: referências remotas não existem

107

Em resumo;

  • Como posso excluir vários controles remotos mesclados?

Mais informações;

Eu tenho um repositório git com dezenas de remotos que foram mesclados no master. Posso excluir esses controles remotos um de cada vez usando:

git push --delete origin myBranch-1234

No entanto, este é um processo lento e tedioso para todos os controles remotos. Então, estou tentando este comando:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --mergedlista todos os controles remotos mesclados.
grep origindiz ao comando para incluir a origem.
grep -v masterdiz ao comando para excluir o mestre.
xargs git push origin --deletediz ao comando para excluir a lista de controles remotos.

Todos juntos, espero que isso reúna todos os controles remotos mesclados e os exclua.

Quando executo o comando acima, recebo o seguinte para cada controle remoto mesclado;

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

No entanto, esses controles remotos existem e posso verificar cada um deles. Muitos sites e pessoas recomendam que eu corra git fetch --prunepara limpar as referências ausentes. Isso não faz nada porque todos esses controles remotos existem.

Então eu pergunto a você, querida troca de pilha;

  • Por que posso excluir um controle remoto, mas não muitos?
  • Meu comando está correto?

Acho que estou perdendo algo pequeno. Cada vez que pesquiso isso, parece que estou fazendo corretamente, mas estou recebendo os erros acima.

Jqw
fonte

Respostas:

226

Você pode precisar limpar seu "cache" local de branches remotos primeiro. Tente executar:

git fetch -p origin

antes de excluir.

Igor
fonte
2
Isso resolveu para mim, obrigado! No entanto, por que ele não está atualizando quando busco sem --prune? Na minha opinião, isso é muito enganador
dave0688
6
Apenas uma observação para as pessoas que chegam aqui de uma pesquisa - embora isso seja claramente útil para a maioria que chega aqui, não é realmente correto em termos do problema original - o problema do OP era que seu comando incluía incorretamente origin/nos nomes dos ramos, conforme descrito / resolvido em outras respostas.
CupawnTae
104

Esses ramos são removidos do remoto (origem)? Se sim, você pode simplesmente fazer

git fetch --prune origin

Caso contrário, eles podem retornar mesmo depois de excluí-los localmente.

Atualização: Olhando novamente para o seu comando, parece que você está compilando-o incorretamente. Você provavelmente quer

git push origin --delete myBranch-1234

mas em vez disso, você está fazendo algo como

git push origin --delete origin/myBranch-1234
Mykola Gurov
fonte
Nenhum dos ramos é removido na origem. Eu posso verificar qualquer um deles.
Jqw de
1
sim, porque você executa comandos diferentes no segundo caso.
Mykola Gurov
1
Eu não entendo seu ponto. Eu sei que estou usando dois comandos diferentes. O segundo caso é obter todos os controles remotos mesclados com git branch -r --mergede, em seguida, estou tentando excluí-los com xargs git push origin --delete. O comando está tentando excluir os controles remotos, mas acredita que o remote ref does not exist.
Jqw de
1
em seu segundo comando canalizado, coloque echo ao lado de xargspara ver o que é realmente executado.
Mykola Gurov
2
@Jqw Você não pode incluir o origin/prefixo no nome do branch, git já sabe que você está trabalhando com os branches de origem desde que você está executando git push origin. A sugestão de Mykola foi fazer a última parte do comando xargs echo, ao invés de echo xargs [...].
Mateus leu
15

Use sedpara remover a parte 'origin /' e alterar uma xargsparte lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
Kost
fonte