Quando tento confirmar alterações, recebo este erro:
error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt
Alguma idéia de como resolver esse erro?
EDITAR
Eu tentei, git fsck
eu tenho:
error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt
git add
operação? O seu disco rígido está cheio?git fsck
cuidavam disso.Respostas:
Eu tive um problema parecido. Meu laptop ficou sem bateria durante uma operação git. Vaia.
Eu não tinha nenhum backup. (Nota: O Ubuntu One não é uma solução de backup para o git; ele substituirá o seu repositório sadio por um corrompido.)
Para os assistentes do git, se essa foi uma maneira ruim de corrigi-lo, deixe um comentário. No entanto, funcionou para mim ... pelo menos temporariamente.
Etapa 1: Faça um backup do .git (na verdade, eu faço isso entre todas as etapas que mudam algo, mas com uma nova cópia para o nome, por exemplo, .git-old-1, .git-old-2, etc.) :
Etapa 2: executar
git fsck --full
Etapa 3: Remova o arquivo vazio. Descobri, mas que droga; está em branco de qualquer maneira.
Etapa 3: execute
git fsck
novamente. Continue excluindo os arquivos vazios. Você também podecd
entrar no.git
diretório e executarfind . -type f -empty -delete -print
para remover todos os arquivos vazios. Eventualmente, o git começou a me dizer que estava realmente fazendo algo com os diretórios de objeto:Etapa 4: depois de excluir todos os arquivos vazios, finalmente cheguei à
git fsck
execução:Etapa 5: tente
git reflog
. Falhar porque minha cabeça está quebrada.Etapa 6: Google. Encontre isso . Obtenha manualmente as duas últimas linhas do reflog:
Etapa 7: Observe que, na Etapa 6, aprendemos que o HEAD está atualmente apontando para o último commit. Então, vamos tentar apenas olhar para o commit pai:
Funcionou!
Etapa 8: agora precisamos apontar HEAD para 9f0abf890b113a287e10d56b66dbab66adc1662d.
O que não reclamou.
Etapa 9: veja o que o fsck diz:
Etapa 10: O ponteiro sha1 inválido na árvore de cache parecia ser de um arquivo de índice ( fonte desatualizado) (agora desatualizado ). Então eu o matei e redefinii o repositório.
Etapa 11: olhando para o fsck novamente ...
Os blobs pendentes não são erros . Não estou preocupado com o conflito master.u1, e agora que está funcionando, não quero mais tocá-lo!
Etapa 12: atualizando minhas edições locais:
Então espero que isso possa ser útil para as pessoas no futuro. Estou feliz que funcionou.
fonte
Os arquivos do objeto git ficaram corrompidos (como apontado em outras respostas também). Isso pode acontecer durante falhas na máquina, etc.
eu tive a mesma coisa. Depois de ler as outras respostas principais aqui, encontrei a maneira mais rápida de corrigir o repositório git quebrado com os seguintes comandos (execute no diretório de trabalho git que contém a
.git
pasta):Isso removerá primeiro qualquer arquivo de objeto vazio que cause corrupção no repositório como um todo e, em seguida, busca os objetos ausentes (bem como as alterações mais recentes) do repositório remoto e, em seguida, faz uma verificação completa do armazenamento de objetos . Que, neste momento, deve ter sucesso sem erros (ainda podem haver alguns avisos!)
fonte
Este erro ocorre comigo quando estou pressionando meu commit e meu computador trava. É assim que eu consertei.
Etapas para corrigir
mostra o arquivo de objeto vazio / corrompido
remova
Eu recebi
fatal: bad object HEAD
mensagemEu removo o
index
para a redefiniçãofatal: Não foi possível analisar o objeto 'HEAD'.
apenas para verificar o que está acontecendo
imprime as duas últimas linhas
tail -n 2
da ramificação de log para mostrar minhas duas últimascommit hash
Eu escolho o ultimo
commit hash
mostra todo o meu arquivo como
deleted
porque eu removi o.git/index
arquivocontinue com a redefinição
verificar minha correção
Nota: As etapas começam quando eu cheguei nesta pergunta e usei as respostas como referência.
fonte
Resolvi isso removendo os vários arquivos vazios que o git fsck estava detectando e executando um simples git pull.
Acho decepcionante que, agora que mesmo os sistemas de arquivos implementem o registro no diário e outras técnicas "transacionais" para manter o fs sadio, o git possa chegar a um estado corrompido (e não conseguir se recuperar sozinho) devido a uma falha de energia ou espaço no dispositivo.
fonte
Acabei de ter o mesmo problema: depois de puxar o repositório distante, quando fiz um status git, obtive: "error: o arquivo de objeto (...) está vazio" "fatal: o objeto solto (...) está corrompido"
A maneira que resolvi isso foi:
Não sei exatamente o que as coisas aconteceram, mas essas instruções pareciam deixar tudo limpo.
fonte
cd .git/ && find . -type f -empty -delete
Como tenho que reiniciar minha VM regularmente, esse problema ocorre de alguma maneira comigo com muita frequência. Após algumas vezes, percebi que não posso repetir o processo descrito por @ Nathan-Vanhoudnos toda vez que isso acontece, embora sempre funcione. Então eu descobri a seguinte solução mais rápida.
Passo 1
Mova seu repositório inteiro para outra pasta.
Passo 2
Clone o repositório da origem novamente.
etapa 3
Retirar tudo sob o novo repositório, exceto o .git pasta .
Passo 4
Mova Tudo do temp_repo para o novo repositório, exceto o .git pasta .
Etapa 5
Remova o temp_repo e pronto.
Depois de algumas vezes, tenho certeza de que você pode executar esses procedimentos muito rapidamente.
fonte
git clone source_to_current_repo.git clean_repo
, 2) faça backup da pasta .git antiga, 3) copie sobre a pasta .git limpa.Isso é tudo. Talvez não seja o melhor caminho, mas acho que é tão prático.
fonte
No meu caso, esse erro ocorreu porque eu estava digitando a mensagem de confirmação e meu notebook foi desligado.
Eu executei estas etapas para corrigir o erro:
git checkout -b backup-branch
# Crie uma ramificação de backupgit reset --hard HEAD~4
# Redefina para o commit, onde tudo funciona bem. No meu caso, tive que voltar com 4 confirmações na cabeça, ou seja, até que minha cabeça estivesse no ponto antes de digitar a mensagem de confirmação. Antes de executar esta etapa, copie o hash dos commits que você redefinirá, no meu caso eu copiei o hash dos 4 últimos commitsgit cherry-pick <commit-hash>
# Cherry escolhe as confirmações redefinidas (no meu caso, são 4 confirmações, então eu fiz essa etapa 4 vezes) do ramo antigo para o novo ramo.git push origin backup-branch
# Empurre a nova ramificação para garantir que tudo funcione bemgit branch -D your-branch
# Exclua a ramificação localmente ('sua ramificação' é a ramificação com problema)git push origin :your-branch
# Exclua a ramificação do controle remotogit branch -m backup-branch your-branch
# Renomeie a ramificação de backup para ter o nome da ramificação que teve o problemagit push origin your-branch
# Empurre o novo ramogit push origin :backup-branch
# Exclua a ramificação de backup do controle remotofonte
resolver meu problema
fonte
git status
.Aqui está uma maneira muito simples e rápida de lidar com esse problema, se você tiver um repositório local com todas as ramificações e confirmações necessárias e se estiver certo em criar um novo repositório (ou excluir o repositório do servidor e criar um novo) em seu lugar):
Isso preserva todo o histórico de submissões e ramificações que você tinha no seu repositório local.
Se você tiver colaboradores no repositório, acho que, em muitos casos, tudo o que seus colaboradores precisam fazer é alterar também o URL remoto do repositório local e, opcionalmente, enviar todos os commits que o servidor não possui.
Esta solução funcionou para mim quando me deparei com esse mesmo problema. Eu tive um colaborador. Depois de enviar meu repositório local para o novo repositório remoto, ele simplesmente mudou o repositório local para apontar para o URL do repositório remoto e tudo funcionou bem.
fonte
Eu tive o mesmo problema depois que meu laptop travou. Provavelmente, por ser um repositório grande, eu tinha muitos arquivos de objetos corrompidos, que só apareciam um de cada vez ao chamar
git fsck --full
, então escrevi um pequeno liner de shell para excluir automaticamente um deles:$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`
2>&1
redireciona a mensagem de erro para stdout para poder cumprimentá-la-o
retorna apenas a parte de uma linha que realmente corresponde-E
permite regexes avançadas-m 1
verifique se apenas a primeira correspondência é retornada[0-9a-f]{2}
corresponde a qualquer um dos caracteres entre 0 e 9 e aef se dois deles ocorrerem juntos[0-9a-f]*
corresponde a qualquer número de caracteres entre 0 e 9 e a e f ocorrendo juntosEle ainda exclui apenas um arquivo de cada vez, portanto, convém chamá-lo em um loop como:
$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done
O problema é que ele não produz mais nada útil, portanto você não sabe quando está finalizado (ele não deve ser útil depois de algum tempo)
Para "consertar" isso, adicionei uma chamada de
git fsck --full
após cada rodada da seguinte maneira:$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done
Agora é aproximadamente metade da velocidade, mas produz o "estado".
Depois disso, eu brinquei com algumas sugestões neste tópico e finalmente cheguei a um ponto em que eu podia
git stash
egit stash drop
muitas coisas quebradas.primeiro problema resolvido
Depois, eu ainda tinha o seguinte problema:
unable to resolve reference 'refs/remotes/origin/$branch': reference broken
que poderia ser resolvido por$ rm \repo.git\refs\remotes\origin\$branch
$ git fetch
Então eu fiz um
$ git gc --prune=now
$ git remote prune origin
por uma boa medida e
git reflog expire --stale-fix --all
para se livrar
error: HEAD: invalid reflog entry $blubb
ao corrergit fsck --full
.fonte
Vamos simplificar .. apenas no caso de você ter carregado a fonte no repositório remoto do git
verifique seu git
remover arquivo de objeto vazio (todos)
verifique seu git novamente.
retire sua fonte do git remoto
fonte
Eu me deparo muito com esse problema com máquinas virtuais.
Para mim, os seguintes trabalhos:
Se você deseja salvar alguns downloads - entre no seu explorador de arquivos e exclua todos os arquivos da pasta que já foram confirmados e deixe nas pastas / vendor e / node_modules (eu trabalho com compositor e npm).
então basta criar um novo repositório
adicione seu controle remoto
e buscar o ramo / tudo
e confira
então você deve estar no ponto antes do erro.
Espero que isto ajude.
Saudações.
fonte
Encontro o mesmo problema e uso uma maneira muito simples de corrigi-lo. Descobri que esses arquivos ausentes existiam no computador do meu companheiro de equipe.
I copiado esses arquivos um por um para um servidor git (9 arquivos total), e que resolveu o problema.
fonte
Meus colegas e eu já cruzamos várias vezes com esse mesmo problema e, para resolvê-lo, simplesmente executamos as etapas descritas abaixo. Não é a solução mais elegante que pode ser encontrada, mas funciona sem perda de dados.
old_project
para este exemplo).git clone
.old_project
(exceto o.git
diretório) para o diretório do projeto recém-criado.Espero que ajude...
fonte
Aqui está uma maneira de resolver o problema se seu repositório público no github.com estiver funcionando, mas seu repositório local estiver corrompido. Esteja ciente de que você perderá todos os commits que fez no repositório local.
Tudo bem, então eu tenho um repositório local que está me dando isso
object empty error
, e o mesmo repositório no github.com, mas sem esse erro. Então, o que eu simplesmente fiz foi clonar o repositório que está funcionando no github e depois copiar tudo do repositório corrompido (exceto a pasta .git) e colá-lo no repositório clonado que está funcionando.Isso pode não ser uma solução prática (já que você exclui as confirmações locais), no entanto, você mantém o código e um controle de versão reparado.
Lembre-se de fazer backup antes de aplicar essa abordagem.
fonte
No meu caso, não era importante para mim manter o histórico de consolidação local. Portanto, se isso também se aplica a você, você pode fazer isso como uma alternativa rápida às soluções acima:
Você basicamente substitui o
.git/
diretório corrompido por um diretório limpo.Vamos supor o seguinte diretório para o seu projeto com o git corrompido:
projects/corrupt_git/
cp projects/corrupt_git projects/backup
- (opcional) faça um backupgit clone [repo URL] projects/clean_git
- para que você obtenhaprojects/clean_git
rm -rf corrupt_git/.git/
- remova a pasta .git corrompidamv clean_git/.git/ corrupt_git/
- mova o git limpo paracorrupt_git/.git
git status
inprojects/corrupt_git
- para garantir que funcionoufonte
Copie tudo (na pasta que contém o .git) para um backup, exclua tudo e reinicie. Verifique se você tem o controle remoto git à mão:
Então
Em seguida, mescle todos os novos arquivos manualmente e tente manter o computador ligado.
fonte
Teve o mesmo problema depois de verificar o mestre de uma ramificação limpa. Depois de um tempo, reconheci muitos arquivos modificados no master. Não sei por que eles estiveram lá, depois de mudar de um galho limpo. De qualquer forma, como os arquivos modificados não faziam sentido para mim, apenas os escondi e o erro se foi.
git:(master) git stash
fonte
se você tiver um backup antigo e estiver com pressa:
faça um NOVO BACKUP do seu caminho atual do projeto, quebrado por git.
.git
para a lixeira (nunca exclua).git
do backup antigogit pull
(criará conflitos de mesclagem)./src
(nunca exclua)git gui
, empurre e ... bata palmas!fonte
A solução de doze etapas abordada acima me ajudou a me livrar de um congestionamento. Obrigado. As principais etapas foram inserir:
e remova todos os objetos vazios
Depois, pegue as duas linhas do chicote:
Com os valores retornados
Nesse ponto, não havia mais erros, então fiz um backup dos meus arquivos mais recentes. Em seguida, faça um git pull seguido de um git push. Copiei meus backups para o meu arquivo de repositório git e fiz outro push git. Isso me deixou atualizado.
fonte
Corrigi o erro git: o arquivo de objeto está vazio por:
Espero que isso ajude.
fonte
Isso também acontece comigo quase regularmente. Não fiz um protocolo quando isso acontece exatamente, mas suspeito que ocorra sempre que minha máquina virtual existir "inesperadamente". Se eu fechar a janela da VM (estou usando o Ubuntu 18.04) e começar de novo, as coisas sempre (?) Funcionam. Mas se a janela da VM ainda estiver aberta quando meu laptop for desligado (sistema host do Windows), encontro esse problema com bastante frequência.
Quanto a todas as respostas dadas aqui:
obrigado - eles são muito úteis; Normalmente, salvo uma cópia local do meu código, restauro o repositório do controle remoto e movo a cópia de backup de volta para a pasta local.
como o problema subjacente não é realmente um problema de git, mas sim um problema de VM e / ou Linux, pergunto-me se não deveria haver uma maneira de curar a razão, e sim os sintomas? Esse tipo de erro não indica que algumas alterações no sistema de arquivos não são "aplicadas" em um tempo razoável, mas apenas armazenadas em cache? (veja, por exemplo, /unix/464184/are-file-edits-in-linux-directly-saved-into-disk ) - para mim, parece que as máquinas Linux virtuais não sincronize as coisas com frequência suficiente. Se esse é um problema do VirtualBox da Oracle (que de outra forma funciona muito bem) ou do sistema de arquivos convidado, ou de algumas configurações que todos ignoramos, está além da minha experiência. Mas eu ficaria feliz se alguém pudesse esclarecer isso.
fonte
Na verdade, eu tive o mesmo problema. Tenha uma cópia do seu código antes de tentar isso.
eu apenas fiz
git reset HEAD~
meu último commit foi desfeito, então eu o cometi novamente, problema resolvido!
fonte
Atenção: Com mais experiência, percebo que essa é a opção nuclear e normalmente não deve ser feita e não ensina nada. No entanto, em raras ocasiões para projetos pessoais, eu ainda achei útil, então estou deixando para lá.
Se você não se preocupa em manter seus comprometimentos históricos, basta executar
Em seguida, responda sim a qualquer pergunta sobre a exclusão de arquivos protegidos contra gravação. Problema resolvido em menos de um minuto.
fonte