Eu tenho um repositório Git que contém vários ramos remotos que não existem mais, mas quando tento executar git fetch -p
recebo um erro:
error: refs/remotes/origin/bad/branch does not point to a valid object!
Não consigo encontrar nenhuma maneira de consertar isso. Este branch não existe como um arquivo separado em .git/refs/remotes
(ou em qualquer outro lugar; pesquisei com find
). Tentar excluí-lo git branch -D
não funciona:
$ git branch -D origin/bad/branch
error: branch 'origin/bad/branch' not found.
$ git branch -D bad/branch
error: branch 'bad/branch' not found.
Após os comentários abaixo, tentei adicionar a -r
opção ao git branch -D
e recebi este erro:
$ git branch -D -r origin/bad/branch
error: Couldn't look up commit object for 'refs/remotes/origin/bad/branch'
Existe algum comando mágico de encanamento que eu possa usar para me livrar dessa referência, exceto apenas excluir todo o espaço de trabalho, o que eu realmente preferiria não fazer?
Este comando forçará a exclusão de um branch de rastreamento remoto:
Mas isso não funcionou.
Quando os comandos de nível superior são muito teimosos para fazer o que você deseja, você pode tentar um comando de nível inferior:
Excluindo manualmente
Observe que geralmente não é recomendado editar manualmente as coisas. Mas pode ser necessário. Sem garantias.
Pelo que sei, as referências estão atualmente armazenadas [1] em dois locais possíveis:
.git/refs
.git/packed-refs
(arquivo)Se for um arquivo, ele
origin/bad/branch
será armazenado em.git/refs/origin/bad/branch
. Apenas excluir esse arquivo deve ser seguro.Se for um ref: open compactado
.git/packes-refs
. Não li nenhuma documentação técnica para este formato de arquivo, mas ele se parece apenas com um arquivo no formulário:Nesse caso, você pode encontrar a referência em uma linha como:
Eu acho que você poderia simplesmente excluir essa linha. Mas primeiro faça isso em um backup de todo o repositório (e da árvore de trabalho) apenas por segurança.
Notas
Supondo que você não tenha trabalho inacabado/não salvo no repositório que não consiga confirmar/enviar, isso não poderia ser facilmente corrigido simplesmente excluindo o repositório localmente e clonando-o de volta em sua máquina?
Além disso, encontrei esta pergunta antiga que pode conter informações úteis: remova filiais que não estejam remotas
git não é mágico. Ele precisa armazenar suas informações em algum lugar e esse lugar é o diretório .git. ele armazena todas as configurações, objetos e referências pertencentes ao seu projeto/repositório atual.
.git/refs
contém todas as referências que você tem em seu repositório.A
.git/refs/HEADS
lista de todas as referências que você está gerenciando localmente. Se você abrir qualquer um desses arquivos, verá que há um hash ali, que faz referência ao commit ao qual esse branch faz referência. Você provavelmente olha lá e simplesmente exclui a referência ao ramo ao qual está se referindo. (lembre-se de que se essa ramificação não existir na origem, ou seja, no seu servidor, você efetivamente perdeu seu trabalho, a menos que consiga se lembrar do nome da ramificação e o GC não tenha limpo as referências pendentes.)também não é difícil descobrir que isso
.git/refs/remotes/
se refere a todos os servidores aos quais você conectou seu repositório git e às referências armazenadas lá. Na maioria dos casos, você terá apenas umorigin
diretório.Se você quiser vê-lo em ação, renomeie o
.git/refs/remotes/origin
diretório e execute,git pull
você verá os logs mostrando que há novas ramificações para consultar.Basicamente, exclua o branch incorreto que está na sua
.git/refs/HEADS
pasta local que corresponde ao branch que está dificultando e tente novamente.