Tive uma falha no disco rígido que resultou em alguns arquivos de um repositório Git sendo danificados. Ao executar git fsck --full
, obtenho o seguinte resultado:
error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted
Tenho backups do repositório, mas o único backup que inclui o arquivo do pacote já está danificado. Portanto, acho que tenho que descobrir uma maneira de recuperar os objetos únicos de backups diferentes e de alguma forma instruir o Git a produzir um novo pacote com apenas objetos corretos.
Você pode me dar dicas de como consertar meu repositório?
git
corruption
data-recovery
cristão
fonte
fonte
.git
pasta, é claro) para o repo recém-clonado ... e o fezgit status
no novo repo ... git detecta corretamente todas as alterações afetadas em meus arquivos e posso começar meu trabalho novamente.Respostas:
Em alguns backups anteriores, seus objetos danificados podem ter sido empacotados em arquivos diferentes ou ainda podem ser objetos soltos. Assim, seus objetos podem ser recuperados.
Parece que há alguns objetos ruins em seu banco de dados. Então você pode fazer isso de forma manual.
Por causa de
git hash-object
,git mktree
egit commit-tree
não escrever os objetos porque eles são encontrados no pacote, em seguida, começar a fazer isso:(Seus pacotes são retirados do repositório e desempacotados novamente nele; apenas os objetos bons estão agora no banco de dados)
Você pode fazer:
e verifique o tipo do objeto.
Se o tipo for blob: recupere o conteúdo do arquivo de backups anteriores (com
git show
ougit cat-file
ougit unpack-file
; então você podegit hash-object -w
reescrever o objeto em seu repositório atual.Se o tipo for árvore: você pode usar
git ls-tree
para recuperar a árvore de backups anteriores; em seguida,git mktree
para escrevê-lo novamente em seu repositório atual.Se o tipo for commit: o mesmo com
git show
,git cat-file
egit commit-tree
.Claro, eu faria backup de sua cópia de trabalho original antes de iniciar este processo.
Além disso, dê uma olhada em Como recuperar objetos Blob corrompidos .
fonte
.git/objects/pack/
está vazioBanengusk estava me colocando no caminho certo. Para referência futura, quero postar as etapas que executei para corrigir a corrupção do meu repositório. Tive a sorte de encontrar todos os objetos necessários em pacotes mais antigos ou em backups de repositório.
fonte
Tente os seguintes comandos primeiro (execute novamente se necessário):
E então você ainda tem problemas, tente pode:
remova todos os objetos corrompidos, por exemplo
remova todos os objetos vazios, por exemplo
verifique uma mensagem de "link quebrado" ao:
Isso informa de qual arquivo veio o blob corrompido!
para recuperar o arquivo, você pode ter muita sorte, e pode ser a versão que você já verificou em sua árvore de trabalho:
novamente, e se ele mostrar o SHA1 ausente (4b945 ..), está tudo pronto!
presumindo que era alguma versão mais antiga que estava quebrada, a maneira mais fácil de fazer isso é:
e isso irá mostrar-lhe todo o log desse arquivo (por favor, perceba que a árvore que você tinha pode não ser a árvore de nível superior, então você precisa descobrir em qual subdiretório ele estava sozinho), então agora você pode recriar o objeto ausente com objeto hash novamente.
para obter uma lista de todas as referências com commits, árvores ou blobs ausentes:
Pode não ser possível remover alguns desses refs usando os comandos branch -d ou tag -d regulares, já que eles morrerão se o git perceber a corrupção. Portanto, use o comando de encanamento git update-ref -d $ ref. Note que no caso de branches locais, este comando pode deixar a configuração de branch obsoleta para trás em .git / config. Ele pode ser excluído manualmente (procure a seção [branch "$ ref"]).
Depois que todos os refs estiverem limpos, ainda pode haver commits quebrados no reflog. Você pode limpar todos os reflogs usando git reflog expire --expire = now --all. Se você não quiser perder todos os seus reflogs, você pode pesquisar os refs individuais por reflogs quebrados:
(Observe a opção -g adicionada ao git rev-list.) Então, use git reflog expire --expire = now $ ref em cada um deles. Quando todos os refs e reflogs quebrados desaparecerem, execute git fsck --full para verificar se o repositório está limpo. Objetos pendentes estão ok.
Abaixo você pode encontrar o uso avançado de comandos que potencialmente podem causar perda de seus dados em seu repositório git se não forem usados com sabedoria, então faça um backup antes de acidentalmente causar mais danos ao seu git. Experimente por sua própria conta e risco se você sabe o que está fazendo.
Para puxar o branch atual em cima do branch upstream após a busca:
Você também pode tentar verificar o novo branch e excluir o antigo:
Para encontrar o objeto corrompido no git para remoção, tente o seguinte comando:
Para OSX, use em
sed -E
vez desed -r
.Outra ideia é descompactar todos os objetos de arquivos de pacote para regenerar todos os objetos dentro de .git / objects, então tente executar os seguintes comandos dentro de seu repositório:
Se acima não ajudar, você pode tentar rsync ou copiar os objetos git de outro repo, por exemplo
Para consertar o branch quebrado ao tentar finalizar a compra da seguinte maneira:
Tente removê-lo e check-out do upstream novamente:
No caso de o git colocar você no estado desanexado, verifique o
master
e mescle nele o branch desanexado.Outra ideia é realocar o mestre existente recursivamente:
Veja também:
fonte
Aqui estão as etapas que segui para recuperar de um objeto blob corrompido.
1) Identificar blob corrompido
O blob corrompido é 241091723c324aed77b2d35f97a05e856b319efd
2) Mova o blob corrompido para um lugar seguro (por precaução)
3) Obtenha o pai do blob corrompido
O hash pai é 0716831e1a6c8d3e6b2b541d21c4748cc0ce7180 .
4) Obtenha o nome do arquivo correspondente ao blob corrompido
Encontre esse arquivo específico em um backup ou no repositório git upstream (no meu caso, é dump.tar.gz ). Em seguida, copie-o em algum lugar dentro do seu repositório local.
5) Adicionar arquivo corrompido anteriormente no banco de dados de objetos git
6) Comemore!
fonte
git ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: Could not read 19505205fd1f219993da9b75846fff3cf432152d
, e eu também tentei de novo sem a Etapa 2, e isso resultou emgit ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: inflate: data stream error (invalid stored block lengths) fatal: failed to read object 19505205fd1f219993da9b75846fff3cf432152d: Invalid argument
O checkout do Git pode selecionar arquivos individuais de uma revisão. Basta fornecer o hash de confirmação e o nome do arquivo. Informações mais detalhadas aqui.
Eu acho que a maneira mais fácil de consertar isso com segurança é reverter para o backup não confirmado mais recente e selecionar seletivamente os arquivos não corrompidos dos commits mais recentes. Boa sorte!
fonte
Aqui estão duas funções que podem ajudar se seu backup estiver corrompido ou se você tiver alguns backups parcialmente corrompidos (isso pode acontecer se você fizer backup de objetos corrompidos).
Execute ambos no repositório que você está tentando recuperar.
Aviso padrão: use apenas se você estiver realmente desesperado e tiver feito backup de seu repositório (corrompido). Isso pode não resolver nada, mas pelo menos deve destacar o nível de corrupção.
e
fonte
Resolvi esse problema para adicionar algumas alterações como git add -A e git commit novamente.
fonte