Repositório Git quebrado após a morte do computador

93

Meu computador morreu e agora um dos meus repositórios git está quebrado. Quando tento fazer checkout master, ele me diz:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Quando eu executo git stasheu obtenho:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

Então o que eu posso fazer?

Saída de atualização de git reflog:

fatal: bad default revision 'HEAD'

Não muito promissor ... Resultado de git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt
Vainolo
fonte
Você pode verificar se .git/refs/heads/masterexiste e se seu conteúdo é um hash de commit válido do seu repositório (você pode verificar isso, por exemplo, usando git show <hash>)?
toque em
Eu sei que isso é óbvio, mas ainda perguntando - você tem algum repositório remoto do mesmo repositório git?
Tuxdude,
@poke o conteúdo de .git/refs/heads/master/é um monte de^@
vainolo
@Tuxdude sim, mas não atualizado com minhas últimas mudanças
vainolo
1
O que git reflogisso te diz? Você já tentou correr git fsck?
kynan,

Respostas:

171

Consegui me recuperar através de:

rm .git/refs/remotes/origin/HEAD
git fetch --all
Julian Frumar
fonte
No meu caso, aconteceu porque eu apaguei alguns branches locais e remotos (de alguma forma, o arquivo .git / refs / remotes / origin / HEAD permaneceu em um estado inconsistente). Alterar o conteúdo do arquivo mencionado acima para apontar para um branch local existente (por exemplo, ref: refs / remotes / origin / master) resolveu este problema. Ainda assim, a abordagem acima pode ser melhor, já que HEAD pode apontar para um commit que não está no branch atual.
crissdev
Caso o problema aconteça com um submódulo git específico, o primeiro comando muda ligeiramente pararm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe
1
Eu tive que fazer rm -rf .git/refs/remotes/origin, mas você me indicou a direção certa
Jacka
23

Comece seguindo as etapas sugeridas em Recuperando repositório git quebrado :

  • verifique se .git/refsainda contém algo útil
  • verifique git refloge falhando se o conteúdo de .git/logs/refs/heads/masterou qualquer outro ramo em que você estava
  • correr git fsck, potencialmente com --unreachableou--lost-found

Esperançosamente, isso permitirá que você descubra qual masterdeve ser o ref para que você possa restaurá-lo (ou seja, inserir o SHA1 correto .git/refs/heads/master).

No caso de qualquer objeto contido naquele commit estar genuinamente corrompido, você não pode restaurar seu HEADcommit infelizmente. Assumindo que sua árvore de trabalho e / ou índice estão intactos, você pode tentar um git reset --soft(ou não a git reset) para o commit anterior e então refazer o commit. Evite quaisquer operações que alterem seu sa git checkout -fou árvore de trabalho git reset --hard.

kynan
fonte
Eu olhei .git/logs/refs/heads/mybranch. Mostra algum tipo de histórico de commits para este branch. Procurando por isso, selecionei SHAs e tentei exibi-los com git show. (Cada commit tem dois SHAs, eu escolhi o segundo, logo antes do nome do autor.) O último estava corrompido, mas o anterior poderia ser git shown e eu fui capaz de enviá-lo com git push origin abcdef:mybranch.
Ed Avis
12

Eu tive um problema semelhante após uma tela azul da morte no Windows 8.1

Eu tinha um arquivo neste local ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

E estava vazio, enquanto os outros arquivos de ramificação nesta pasta tinham longas cadeias de caracteres dentro deles.

NB eu não tive nenhuma mudança / commits

  • Eu fiz backup do <problem-branch>arquivo
  • Excluiu o arquivo
  • git fetch --all para obter o galho novamente

Então, o preenchimento automático da guia começou a funcionar novamente

Carlton
fonte
6

Se não houver muitos arquivos modificados, acho que a maneira conveniente de resolver esse problema é:

  1. faça backup dos arquivos que você modificou no repo
  2. remova seu repo existente
  3. clonar novamente do servidor
  4. cole os arquivos da etapa 1 no repo e git commit -a
alsotang
fonte
sim, ninguém poderia pensar em reclonar. ótima sugestão
Selman Genç
5

Consegui resolver isso excluindo o arquivo mestre no diretório git \ refs \ heads

Manos Gaitanakis
fonte
Isso ajudou, ele removeu o branch da minha lista no intellij e eu verifiquei como um novo branch. Felizmente, eu forcei minhas alterações para que estivessem todas lá.
OAM
4

Após um congelamento computadorizada e acidente, meu git branch foi danificado com a mensagem: git fatal: your current branch appears to be broken. Eu não pude fazer nada.

Depois de fazer git fsckmencionei que o ramo tinha um error: Invalid HEAD. refs/heads/<branch>teve um invalid sha1 pointer.

Ao seguir as opções aqui, abri .git/refs/heads/<branch>em um editor notepad ++, e cada um dos caracteres sha1 era NUL.

Felizmente, só precisei redefinir o branch para o estado remoto, e isso estava em um repositório bitbucket. Peguei o sha1 da ponta do repositório remoto e copiei para .git/refs/heads/<branch>salvá-lo, depois fiz um git reset --hard HEADe tudo voltou ao normal.

j4v1
fonte
2

Eu fui idiota o suficiente para esquecer de empurrar e meu computador travou enquanto realizava um commit. Eu poderia recuperar tudo, exceto o último commit, abrindo .git / logs / refs / heads /

Este arquivo contém todos os commits (com seus SHAs) para o branch, o que eu fiz para recuperar foi:

  • Faça backup das últimas alterações em uma pasta temporária
  • mudar para uma "lousa limpa"
    • git checkout master
    • git reset --hard
  • verifique o penúltimo commit no log
  • crie um ramo a partir desta cabeça destacada
  • EMPURRAR
  • Restaurar as últimas mudanças
  • Comprometa-se novamente

Então, mesmo quando você comete um erro estúpido, você não é imediatamente levado de volta por um dia inteiro de trabalho com git :)

Markus Palcer
fonte
1

Eu sei que é uma resposta tarde demais, mas estava recebendo este erro porque não tinha um origin/head. Você pode descobrir isso executando git branch -r. Se você não origin/headvir que está apontando para uma origem remota, você pode definir isso executando git remote set-head origin {{your branch name}}.

Agora execute git branch -rnovamente e você verá algo assim: origin/HEAD -> origin/develop

Espero que isso ajude qualquer pessoa que esteja enfrentando esse problema.

Aaronwbrown
fonte
1

Não consegui fazer o checkout do meu branch master devido ao erro de não é possível bloquear ref. Acabei excluindo: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

e chamando este comando git:

git fetch --all
Keon Sadatian
fonte
1

Perdoe-me se eu repetiria depois de alguém (não li todos os comentários). Na minha opinião, a maneira mais simples de resolver o problema é copiar o projeto sem .git e .idea, limpar, clonar do git, excluir tudo, exceto os diretórios acima e, em seguida, colar a cópia anterior no repo recém-criado com .git e .idea . Espero que faça sentido.

Andrey Sulay
fonte
1

Meu computador travou duas vezes e, como resultado, meu repositório git foi danificado localmente. Não consegui puxar minhas alterações, ele pediu para definir a origem remota, mas não funcionou no gitKraken.

No meu prompt de comando, estava recebendo este erro insira a descrição da imagem aqui

Eu sabia que minhas referências estão quebradas e precisam ser consertadas. O que tive que fazer foi fazer o git bash (no SourceTree clique em "terminal"). Em seguida, navegue até a pasta de referências como esta

cd .git
cd refs
cd remotes
cd origin

haverá um nome de arquivo masterlá, usels para ver o que está no diretório. Em seguida, basta excluí-lo usando o rm master

bam, o arquivo corrompido sumiu. Agora, se você emitir o comando git branch -a, ele produzirá este

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Em seguida, emita este comando, e ele corrigirá suas referências

$ git remote set-head origin master

Para resumir, se você tentar puxar o controle remoto, ele deve mostrar o nome do controle remoto em branco que foi corrigido.

insira a descrição da imagem aqui

Hammad Khan
fonte
0

Eu tive o mesmo problema, mas sem sorte, não consegui descobrir o problema. Peguei meu repo de lado, reclonei o do servidor e tentei mesclar entre eles. Claro que mostrou muitos arquivos não relacionados ao meu branch, mas ajudou a isolar os arquivos necessários.

Samuelens
fonte
0

Verifique se o MSWindows criou arquivos desktop.ini que estão ambos herdando o git? é para mim. Depois que eu excluo todos eles nas subpastas do diretório .git, tudo funciona.

vinnief
fonte
0

Tive o mesmo problema quando o Android Studio foi encerrado repentinamente (devido à perda de energia do computador).

Eu resolvi isso copiando o conteúdo do meu C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterarquivo para o meu C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\masterarquivo.

(Anteriormente, eu também tinha ativado a opção 'Forçar envio' no Android Studio, mas não acho que essa foi uma etapa necessária.)

Nota:

Eu encontrei essa solução comparando o conteúdo dos arquivos em meu C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\diretório (incluindo subdiretórios) com os arquivos correspondentes daqueles em outro projeto saudável - por exemplo C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\,.

Você pode ter um arquivo diferente que está corrompido, mas comparando com outro projeto íntegro, você deve ser capaz de detectar rapidamente o que está errado.

Se você não tiver outro projeto saudável que tenha git configurado, pode valer a pena criar um simples da mesma maneira que você criou seu projeto quebrado para que possa investigar, comparar e corrigir, etc.

PS - Minha mensagem de erro (editada) foi: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

ban-geoengenharia
fonte