Git fatal: a referência tem formato inválido: 'refs / heads / master

101

Estou usando Dropboxpara sincronizar um gitrepositório, mas agora quando tento e pushrecebo um erro:

fatal: Reference has invalid format: 'refs/heads/master (MacBook-Pro's conflicted copy 2012-10-07)'

Então, parece que o Dropbox detectou um conflito e criou uma cópia. Ok, sem problemas, então excluí o arquivo em conflito. Ainda assim, obtendo o erro git acima.

$ git checkout master
    M   index.html
    Already on 'master'
$ git add .
$ git commit -a -m "Cleanup repo"
    [master ff6f817] Cleanup repo
    1 file changed, 5 insertions(+), 5 deletions(-)
$ git push
    fatal: Reference has invalid format: 'refs/heads/master (MacBook-Pro's conflicted copy 2012-10-07)'
    The remote end hung up unexpectedly`

Como posso consertar isso? Obrigado.

Justin
fonte

Respostas:

178

faça um backup do seu repo se você não tiver certeza sobre este, porque esses comandos são irreversíveis.

primeiro, vá para o diretório do repo.

cd myrepo

em seguida, pesquise recursivamente os arquivos em conflito e exclua-os

find . -type f -name "* conflicted copy*" -exec rm -f {} \;

por último, remova quaisquer referências "conflitantes" do arquivo pack-refs do git

awk '!/conflicted/' .git/packed-refs > temp && mv temp .git/packed-refs
faixa
fonte
1
Eu tive o mesmo problema e isso corrigiu para mim. Obrigado!
Erik
Isso consertou para mim também. Obrigado!
cecconeurale
1
para usuários de macosfind . -type f -name "* conflicted copy*" -delete
Soyoes
42

O arquivo em conflito pode estar em vários lugares, eu verificaria:

.git/logs/refs/remotes/origin/
.git/logs/refs/heads/
.git/refs/remotes/origin/
.git/refs/heads/

Ou você pode procurar em todos os lugares no .gitsubdiretório:find . -name '*conflicted*'

Ou, caso contrário, liste os branches ativos com git branch -ae delete ( git branch -d) qualquer coisa suspeita.

Marco Leogrande
fonte
Existem arquivos em conflito em todos os lugares dentro de .git. Eu passei e apaguei todos eles e foi corrigido. Obrigado.
Justin,
2
@Justin Que bom que pude ajudar. Se esta resposta ou qualquer outra resolveu seu problema, marque-a como aceita.
Marco Leogrande,
2
No Mac OS X, use: find . -name '*conflicted*'(Editar: formato)
xgMz
1
@xgMz Obrigado, atualizarei minha resposta, pois sua solução tem validade geral.
Marco Leogrande
1
Com um simples find, consegui um único arquivo conflitante e resolvi manualmente o problema com dois mv. Fazer isso devagar e raciocinar passo a passo é o caminho mais seguro.
pid
8

Isso também acontece com nossa equipe quando meu colega envia suas alterações e desliga o PC antes que o Dropbox seja atualizado.

Eu resolvi tão simplesmente

Excluiu apenas a cópia em conflito. (Cópia em conflito de XXXX aaaa-mm-dd)

E puxe normalmente.

Observe que meu colega fez as alterações antes de bagunçar. E ele empurrou suas mudanças novamente. Desta vez, sem desligamento. :)

Hareen Laks
fonte
1
funcionou absolutamente perfeito para mim :) thx - para mim o dropbox criou um nome de arquivo de string estranho que não era compatível para "atualizar"
cV2
1
Isso funcionou para mim! Havia um arquivo com "cópia conflitante" no nome da pasta / refs / heads e excluí-lo, puxar / empurrar e tudo bem. Obrigado!
DiscDev
7

Consegui excluir todos os arquivos em conflito da minha pasta .git, mas continuei a receber erros sobre arquivos que não existiam mais.

A correção para mim foi abrir .git/refs/packed_refse excluir linhas que continham o texto "conflitante".

Desenhou
fonte
1

Pra mim estava dando erro: fatal: Reference has invalid format: 'refs/tags/r0.2:3'

Você pode ir para o arquivo /.git/packed_refs e deletar a linha pararefs/tags/r0.2:3

Então começou a funcionar. Mas por que isso aconteceu em primeiro lugar, eu não sei.

Rajesh Paul
fonte
0

Experimente um git checkout masterprimeiro para chegar no ramo saudável e bem nomeado.

cutucar
fonte
Saída atualizada na postagem original.
Justin,
Hm, você poderia tentar um full git push origin mastere também colar a saída de git branch -aplease?
toque em
O mesmo erro aqui ... tentar git branch -aresulta nesse mesmo erro!
trusktr
O problema está no repositório remoto, portanto, puxar ou fazer check-out não o resolve. As outras respostas acima referem-se a corrigir diretamente os arquivos no controle remoto e funcionar perfeitamente. SEU CONSELHO É MUITO BOM, mas não é uma resposta para o problema.
pid
0

Eu estava recebendo o mesmo erro

fatal: a referência tem formato inválido: 'refs / heads / somebranch (1)'

para o seguinte comando

git branch

Então, eu procurei por um nome errado (nome do ramo seguido por (1)) usando o comando

find . -name 'somebranch (1)'

E mostrou o seguinte resultado

./.git/refs/heads/somebranch (1)

Que é uma versão duplicada de somebranch IMO. Então, eu removi isso executando o comando find seguido de delete

find . -name 'somebranch (1)' -print -exec rm -rf {} \;

Então o comando branch foi executado com sucesso

git branch
Zeeawan
fonte
0

Encontrei um erro semelhante, como

fatal: Reference has invalid format: 'refs/heads/user-search-api (Sithu's conflicted copy 2016-01-08)'

A simples exclusão do arquivo .git/refs/heads/user-search-api (Sithu's conflicted copy 2016-01-08)no repositório remoto do Dropbox resolveu o problema.

Sithu
fonte