Sempre que puxo do meu controle remoto, recebo o seguinte erro sobre compactação. Quando executo a compactação manual, obtenho o mesmo:
$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack
Alguém sabe o que fazer sobre isso?
Do arquivo cat, recebo o seguinte:
$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file
E do git fsck eu recebo isso (não sei se está realmente relacionado):
$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted
Alguém pode me ajudar a decifrar isso?
git
version-control
asgerhallas
fonte
fonte
Respostas:
Parece que você tem um objeto de árvore corrompido. Você precisará obter esse objeto de outra pessoa. Espero que eles tenham uma versão incorreta.
Você pode reconstruí-lo se não conseguir encontrar uma versão válida de outra pessoa, adivinhando quais arquivos devem estar lá. Você pode querer ver se as datas e horas dos objetos correspondem a ele. Essas podem ser as bolhas relacionadas. Você pode inferir a estrutura do objeto em árvore a partir desses objetos.
Dê uma olhada nos screencasts de Git de Scott Chacon sobre os internos do git. Isso mostrará como o git funciona sob o capô e como realizar esse trabalho de detetive se você estiver realmente preso e não puder obter esse objeto de outra pessoa.
fonte
git cat-file -t <SHA1>
dirá o tipo. Se não estiver corrompido, você poderá fazer issogit cat-file <type> <SHA1>
para ver o conteúdo (usei-o para ablob
, acho que também mostrará o conteúdo de outros tipos).blob
. Quando eu segui estas instruções, porém,git status
responsedfatal: unable to read <SHA1>
mesmo que eu tinha executado com êxitogit hash-object -w <file>
(provavelmente porque, por suas instruções, eu tinha movido esse arquivo objeto afastado Retornando ele só me deu o mesmo.corrupt loose object
Erro.)Eu tive o mesmo problema (não sei por que).
Essa correção requer acesso a uma cópia remota não corrompida do repositório e manterá intacta sua cópia local de trabalho.
Mas tem algumas desvantagens:
O conserto
Execute estes comandos no diretório pai acima do seu repositório (substitua 'foo' pelo nome da pasta do seu projeto):
cp -R foo foo-backup
git clone [email protected]:foo foo-newclone
rm -rf foo/.git
mv foo-newclone/.git foo
rm -rf foo-newclone
No Windows, você precisará usar:
copy
ao invés decp -R
rmdir /S
ao invés derm -rf
move
ao invés demv
Agora, foo tem seu
.git
subdiretório original de volta, mas todas as alterações locais ainda estão lá.git status
,commit
,pull
,push
, Etc. trabalho novamente como deveriam.fonte
.git
pasta.Sua melhor aposta é provavelmente clonar novamente do repositório remoto (por exemplo, Github ou outro). Infelizmente, você perderá quaisquer confirmações não enviadas e alterações ocultas; no entanto, sua cópia de trabalho deve permanecer intacta.
Primeiro faça uma cópia de backup dos seus arquivos locais. Em seguida, faça isso a partir da raiz da sua árvore de trabalho:
Em seguida, confirme os arquivos alterados, conforme necessário.
fonte
master
pelo nome do seu ramo.working
quando ele foi corrompido e essas etapas não me deram uma cópia local de nenhum ramoworking
que não fosse o mestre (e sim, eu tentei substituir o mestre acima por mas não funcionou). Acabei fazendo as etapas acima commaster
, em seguida, escondendo minhas alterações e fazendocheckout -b working origin/working
e aparecendo a esconderijo lá. Parece ter funcionado - obrigado!git status
cederamfatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. Excluir o submódulo do sistema de arquivos e reiniciar o processo restaurou a normalidade. Provavelmente, garantir que não haja conjuntos de alterações não empurrados nos submódulos primeiro é uma boa idéia ...Trabalhando em uma VM, no meu notebook, a bateria acabou, recebi esse erro;
Consegui fazer o repo funcionar novamente com apenas 2 comandos e sem perder meu trabalho (arquivos modificados / alterações não confirmadas)
Depois que eu executei um
git status
, o repositório foi bom e houve minhas alterações (aguardando confirmação, faça-o agora ..).git versão 1.9.1
Lembre-se de fazer backup de todas as alterações que lembrar, caso essa solução não funcione e seja necessária uma abordagem mais radical.
fonte
find .git/objects/ -size 0 -exec rm -f {} \;
trabalha para mim;)git symbolic-ref HEAD refs/heads/master.
após a exclusão dos objetos vazios.Meu computador travou enquanto eu escrevia uma mensagem de confirmação. Após a reinicialização, a árvore de trabalho estava como eu a havia deixado e pude confirmar com êxito minhas alterações.
No entanto, quando tentei correr
git status
, conseguiAo contrário da maioria das outras respostas, eu não estava tentando recuperar nenhum dado . Eu só precisava que o Git parasse de reclamar sobre o arquivo de objeto vazio.
Visão geral
O "arquivo de objeto" é a representação em hash do git de um arquivo real com o qual você se preocupa. O Git acha que deveria ter uma versão com hash
some/file.whatever
armazenada.git/object/xx/12345
, e corrigir o erro acabou sendo principalmente uma questão de descobrir qual arquivo o "objeto solto" deveria representar.Detalhes
As opções possíveis pareciam ser
Abordagem 1: Remover o arquivo de objeto
A primeira coisa que tentei foi apenas mover o arquivo de objeto
Isso não funcionou - o git começou a reclamar de um link quebrado. Para a abordagem 2.
Abordagem 2: corrigir o arquivo
Linus Torvalds tem um ótimo artigo sobre como recuperar um arquivo de objeto que resolveu o problema para mim. As principais etapas estão resumidas aqui.
Isso informa qual arquivo o objeto vazio deve ser um hash. Agora você pode consertá-lo.
Depois de fazer isso, verifiquei
.git/objects/xx/12345
, não estava mais vazio e o git parou de reclamar.fonte
Experimentar
Isso funcionou para mim. Esconde tudo o que você não cometeu e contornou o problema.
fonte
git stash
... fatal: Não foi possível criar 'touch .git/a
/ home / <user> /.git/index.lock': toque de erro de entrada / saída : não é possível tocar em '.git / a': erro de entrada / saídasudo touch /home/guest/.git/a
SEM ERROgit stash
Não alterações locais para salvargit status
... nada a cometer, diretório de trabalho limpoUma coleta de lixo corrigiu meu problema:
Demora um pouco para ser concluído, mas todos os objetos soltos e / ou índices corrompidos foram corrigidos.
fonte
simplesmente executando um
git prune
problema corrigido para mimfonte
git pull
demora um pouco mais do que o habitual, eu acho, porque está substituindo alguns objetos removidos ou algo assim.Acabei de experimentar isso - minha máquina travou enquanto escrevia no repositório Git e ficou corrompida. Corrigi-o da seguinte maneira.
Comecei analisando quantas confirmações não havia enviado ao repositório remoto, assim:
Se você não usar esta ferramenta, é muito útil - disponível em todos os sistemas operacionais, tanto quanto eu sei. Isso indicava que meu controle remoto estava faltando dois commits. Portanto, cliquei no rótulo indicando a confirmação remota mais recente (geralmente isso será
/remotes/origin/master
) para obter o hash (o hash tem 40 caracteres, mas, por uma questão de brevidade, estou usando 10 aqui - geralmente isso funciona de qualquer maneira).Aqui está:
Clico no commit a seguir (ou seja, o primeiro que o controle remoto não possui) e obtenho o hash lá:
Eu então uso os dois para fazer um patch para esse commit:
Em seguida, fiz o mesmo com o outro commit ausente, ou seja, usei o hash do commit anterior e o hash do próprio commit:
Depois mudei para um novo diretório, clonei o repositório do controle remoto:
Em seguida, mudei os arquivos de patch para a nova pasta e os apliquei e confirmei com suas mensagens de confirmação exatas (elas podem ser coladas
git log
nagitk
janela):Isso restaurou as coisas para mim (e observe que provavelmente existe uma maneira mais rápida de fazer isso para um grande número de confirmações). No entanto, eu estava ansioso para ver se a árvore no repositório corrompido pode ser reparada e a resposta é que pode. Com um repositório reparado disponível como acima, execute este comando na pasta quebrada:
Você obterá algo como isto:
Para fazer o reparo, eu faria isso na pasta quebrada:
ou seja, remova o arquivo corrompido e substitua-o por um bom. Você pode ter que fazer isso várias vezes. Finalmente, haverá um ponto em que você pode executar
fsck
sem erros. Você provavelmente terá as linhas "dangling commit" e "dangling blob" no relatório, que são uma consequência de suas rebotes e reparações nesta pasta e estão OK. O coletor de lixo os removerá no devido tempo.Assim (pelo menos no meu caso) uma árvore corrompida não significa que as confirmações não enviadas sejam perdidas.
fonte
Eu estava recebendo um erro corrompido de objeto solto também.
Corrigi-o com sucesso, entrando no diretório do objeto corrompido. Vi que os usuários atribuídos a esse objeto não eram do meu usuário do git. Não sei como aconteceu, mas corri um
chown git:git
arquivo e funcionou novamente.Isso pode ser uma solução potencial para os problemas de algumas pessoas, mas não é necessário para todas elas.
fonte
Eu recebi esse erro depois que minha máquina (windows) decidiu reiniciar-se. Felizmente, meu repo remoto estava atualizado, então fiz um novo clone do Git ..
fonte
Runnning
git stash; git stash pop
corrigiu meu problemafonte
Eu segui muitos dos outros passos aqui; A descrição de Linus de como olhar para a árvore / objetos git e descobrir o que está faltando foi especialmente útil. git-git recuperar blob corrompido
Mas, no final, para mim, havia objetos de árvore soltos / corrompidos causados por uma falha parcial do disco, e os objetos de árvore não são tão facilmente recuperados / não cobertos por esse documento.
No final, tirei o conflito
objects/<ha>/<hash>
do caminho e useigit unpack-objects
com um arquivo de pacote de um clone razoavelmente atualizado. Foi capaz de restaurar os objetos em árvore ausentes.Ainda me deixou muitos blobs pendentes, o que pode ser um efeito colateral da descompactação de coisas anteriormente arquivadas e abordada em outras perguntas aqui
fonte
Em resposta a @ user1055643 falta o último passo:
fonte
.git
e copiar do projeto clonado, o repositório funcionará, mas nenhuma ramificação local nem stashes serão preservados.Acabamos de ter o caso aqui. Aconteceu que o problema era que a propriedade do arquivo corrompido era raiz, em vez de nosso usuário normal. Isso foi causado por uma confirmação feita no servidor depois que alguém fez um "sudo su -".
Primeiro, identifique seu arquivo corrompido com:
Você deve receber uma resposta como esta:
Vá na pasta onde está o arquivo corrompido e faça um:
Verifique a propriedade do arquivo corrompido. Se isso for diferente, volte para a raiz do seu repositório e faça um:
Espero que ajude!
fonte
Para mim, isso aconteceu devido a uma falha de energia ao fazer um
git push
.As mensagens eram assim:
Eu tentei coisas do tipo,
git fsck
mas isso não ajudou. Como a falha ocorreu durante umgit push
, obviamente ocorreu durante a reescrita no lado do cliente, o que ocorre após a atualização do servidor. Olhei em volta e percebi que,c2388
no meu caso, era um objeto de confirmação, porque era referido pelas entradas em.git/refs
. Então, eu sabia que seria capaz de encontrarc2388
quando olhar a história (por meio de uma interface da web ou de um segundo clone).No segundo clone, fiz um
git log -n 2 c2388
para identificar o antecessor dec2388
. Então eu modifiquei manualmente.git/refs/heads/master
e.git/refs/remotes/origin/master
para ser o antecessor emc2388
vez dec2388
. Então eu poderia fazer agit fetch
. Agit fetch
falha ocorreu algumas vezes em conflitos em objetos vazios. Eu removi cada um desses objetos vazios até obtergit fetch
êxito. Isso curou o repositório.fonte
Eu resolvi desta maneira: decidi simplesmente copiar o arquivo de objeto não corrompido do clone do backup para o meu repositório original. Isso funcionou tão bem. (A propósito: se você não conseguir encontrar o objeto em .git / objects / pelo nome, provavelmente ele foi embalado [pacote] para economizar espaço).
fonte
Eu tive esse mesmo problema no meu repositório remoto remoto do git. Após muita solução de problemas, descobri que um dos meus colegas de trabalho havia feito um commit no qual alguns arquivos em .git / objects tinham permissões de 440 (r - r -----) em vez de 444 (r - r - r -) Depois de pedir ao colega de trabalho para alterar as permissões com "objetos chmod 444 -R" dentro do repositório bare git, o problema foi corrigido.
fonte
Eu apenas tive um problema como este. Meu problema específico foi causado por uma falha no sistema que corrompeu a confirmação mais recente (e, portanto, também a ramificação principal). Eu não tinha pressionado e queria refazer esse compromisso. No meu caso particular, eu pude lidar com isso assim:
.git/
:rsync -a .git/ git-bak/
.git/logs/HEAD
e encontre a última linha com um ID de confirmação válido. Para mim, esse foi o segundo commit mais recente. Isso foi bom, porque eu ainda tinha as versões de diretório de trabalho do arquivo e, portanto, todas as versões que eu queria.git branch temp <commit-id>
git reset master temp
para mover a ramificação principal para o novo commit que você fez na etapa 2.git checkout master
e verifique se está bemgit log
.git branch -d temp
.git fsck --full
e agora deve ser seguro excluir qualquer objeto corrompido encontrado pelo fsck.Isso funcionou para mim. Suspeito que esse seja um cenário razoavelmente comum, já que o commit mais recente é o mais provável de ser corrompido, mas se você perder outro, provavelmente ainda poderá usar um método como esse, com o uso cuidadoso de
git cherrypick
e o reflog no.git/logs/HEAD
.fonte
Quando tive esse problema, fiz backup de minhas alterações recentes (como sabia o que havia mudado) e excluí o arquivo que estava reclamando em .git / location. Então eu fiz um puxão de git. Tome cuidado, porém, isso pode não funcionar para você.
fonte
Eu encontrei isso quando meu sistema travou. O que eu fiz é o seguinte:
(Observe que suas confirmações corrompidas foram perdidas, mas as alterações são mantidas. Talvez seja necessário recriar essas confirmações no final deste procedimento)
.git
pasta..git
pasta nele.fonte
Apenas remova a pasta .git e adicione-a novamente. Esta solução simples funcionou para mim.
fonte
.git
e copiar do projeto clonado, o repositório funcionará, mas nenhuma ramificação local nem stashes serão preservados. Além disso, uma sugestão amigável, exclua sua resposta completamente para parar de receber votos negativos.