Tentei clonar meu repositório, que mantenho na pasta One do Ubuntu, para uma nova máquina e consegui:
christopher@christopher-laptop:~/source/personal$ git clone ~/Ubuntu\ One\ Side\ Work/projects.git/
Cloning into 'projects'...
done.
fatal: unable to read tree 29a422c19251aeaeb907175e9b3219a9bed6c616
christopher@christopher-laptop:~/source/personal$
Então, tentei olhar para as muitas outras perguntas como esta que foram feitas aqui e a maioria delas diz para correr git fsck --full
e eu entendo isso quando tento fazer isso.
christopher@christopher-laptop:~/Ubuntu One Side Work/projects.git$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (447/447), done.
broken link from commit 235ae1f48701d577d71ebd430344a159e5ba4881
to commit 984c11abfc9c2839b386f29c574d9e03383fa589
broken link from tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
to blob 25a742dff0a403b2b3884f2ffddf63eb45721fac
broken link from tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
to blob dd4e97e22e159a585b20e21028f964827d5afa4e
broken link from tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
to tree 29a422c19251aeaeb907175e9b3219a9bed6c616
broken link from tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
to tree 8084e8e04d510cc28321f30a9646477cc50c235c
broken link from tree 774b5b4157b4caae1c6cad96c8eaf5d4eba2c628
to blob a0daa0c1567b55d8de2b4d7a3bc010f58c047eab
broken link from tree 774b5b4157b4caae1c6cad96c8eaf5d4eba2c628
to blob e9052d35bfb6d30065b206fc43f4200a04d5281b
broken link from tree 774b5b4157b4caae1c6cad96c8eaf5d4eba2c628
to blob 1a3a5e4dd2502ac121c22f743c4250e254a94eeb
broken link from tree 4aa336dc1a5838e8918e03b85580069d83f4ad09
to tree 8cc55ec952dc192a233e062201d1e7e873ac3db0
broken link from tree e5674a91a53e15575a1f3bf5786bc5cc719fb483
to blob 4a994e1e7bb7ce28dcec98bad48b9a891d7dec51
broken link from tree e5674a91a53e15575a1f3bf5786bc5cc719fb483
to blob ac033bf9dc846101320c96a5ce8aceb8c96ec098
broken link from tree 252ab84542264e1589576b6ee51e7a31e580a0e2
to tree 2069041cd5950e529e2991d37b7290ec021d90d4
broken link from tree 2d4964aa4d4f5d8c7228518ce72ef6a63f820c6d
to blob d83690e1b9a6bdd8a08754b38231799acefcb2ab
broken link from tree c7192e82fc581bd6448bda1a25e8729bdac5f4ff
to blob 30d54d47ae82add1917ca173d42e58b396df580b
broken link from tree 7c66306901fc71389623286936cef172d4ffe408
to blob bc7e05d705401273b1df4e939de0f540597c0931
broken link from tree 0940f5fd227d4c84d6e6749d872db50a4522ae3a
to tree 923767594ac22023e824948d65622fe5b407d1a1
broken link from tree 8eadcd2a971e8357d24f0d80f993d2963452209f
to blob 2598bde3dc8cb80ee49510b8159344004b88645f
broken link from tree ffa302dd0d969172ef23caeefe856ab2f57a4e4d
to blob d6925fa431be1ac585bf9a481e98f75107a6e6fb
broken link from tree 7045b8870a49ce30a2027537a96d73d162bda773
to blob 25688652dea26f61f576ca1b52b9d1a18fbfd01d
broken link from tree 37e4705d34bd440ce681ae32ae9a180a13256d72
to tree 246f564d4cee53339b8a4244f3173b61caa518eb
missing blob d6925fa431be1ac585bf9a481e98f75107a6e6fb
missing blob ac033bf9dc846101320c96a5ce8aceb8c96ec098
missing tree 29a422c19251aeaeb907175e9b3219a9bed6c616
missing tree 8084e8e04d510cc28321f30a9646477cc50c235c
missing blob 30d54d47ae82add1917ca173d42e58b396df580b
missing tree 8cc55ec952dc192a233e062201d1e7e873ac3db0
missing blob e9052d35bfb6d30065b206fc43f4200a04d5281b
dangling tree 4b26e95db542c72ac4a22ec25abe38fb2de79752
missing blob d83690e1b9a6bdd8a08754b38231799acefcb2ab
missing blob 25a742dff0a403b2b3884f2ffddf63eb45721fac
missing tree 923767594ac22023e824948d65622fe5b407d1a1
missing blob 25688652dea26f61f576ca1b52b9d1a18fbfd01d
missing blob 2598bde3dc8cb80ee49510b8159344004b88645f
dangling tree 3a683869f1bb0c1634de75700c316b3b36570dbd
dangling blob 4098d30843380d798a811f1aa9a02994f0dbbb27
missing tree 2069041cd5950e529e2991d37b7290ec021d90d4
missing blob 4a994e1e7bb7ce28dcec98bad48b9a891d7dec51
missing blob 1a3a5e4dd2502ac121c22f743c4250e254a94eeb
missing blob a0daa0c1567b55d8de2b4d7a3bc010f58c047eab
dangling tree 6c7b5162aa7a303fa3fe8dc393c5da564e309521
missing commit 984c11abfc9c2839b386f29c574d9e03383fa589
missing blob bc7e05d705401273b1df4e939de0f540597c0931
missing blob dd4e97e22e159a585b20e21028f964827d5afa4e
missing tree 246f564d4cee53339b8a4244f3173b61caa518eb
dangling commit a01f5c1e5315dc837203d6dee00d3493be9c5db9
Isso parece muito ruim. Quando eu faço um, git log | head
eu entendo isso
christopher@christopher-laptop:~/Ubuntu One Side Work/projects.git$ git log | head
error: Could not read 984c11abfc9c2839b386f29c574d9e03383fa589
fatal: Failed to traverse parents of commit 235ae1f48701d577d71ebd430344a159e5ba4881
commit 2fb0d2d0643b445440f01b164f11ee9ee71fca48
Author: christopher <[email protected]>
Date: Wed Aug 7 15:51:42 2013 -0400
finishing chapter 7
Outras questões aqui disse para olhar ./git/refs/heads/master
. É um repositório básico e refs/heads/
existe, mas refs/heads/master
não existe . HEAD no repositório básico diz ref: refs/heads/master
embora
packed-refs
diz isso embora
# pack-refs with: peeled
2fb0d2d0643b445440f01b164f11ee9ee71fca48 refs/heads/master
Ainda outras perguntas sugeriram execução git reflog
e nenhuma saída aparece quando eu executo isso.
Então, eu realmente não tenho ideia do que fazer aqui. Qual estratégia deve ser tomada? É possível resetar a cabeça para este último commit em 7 de agosto
EDITAR:
Fazer um git log e ir para a parte inferior da tela de saída mostra o seguinte:
commit 996e03b949aea176238e3c7a8452700bbb987ac9
Author: christopher <christopher@christopher>
Date: Wed Jul 3 23:00:44 2013 -0400
many many changes
error: Could not read 984c11abfc9c2839b386f29c574d9e03383fa589
fatal: Failed to traverse parents of commit 235ae1f48701d577d71ebd430344a159e5ba4881
Isso parece estar impedindo o git prune de funcionar
git-repair
é um programa que será executadogit fsck
e tentará consertar todos os problemas que encontrar. git-repair.branchable.com Parece bastante capaz, e embora você possa acabar tendo que copiar (se puder!) objetos de um backup (você tem um backup, certo?), deve economizar muito tempo ao salvando tudo o que pode e deixando o trabalho real, não muitas tarefas automatizáveis. Sem afiliação, etc.Respostas:
Como alternativa à última opção do CodeGnome, se apenas o repositório local estiver corrompido e você souber o url do remoto, pode usar isso para reconfigurar seu
.git
para corresponder ao remoto (substituindo${url}
pelo url remoto):Isso deixa sua árvore de trabalho intacta e afeta apenas a contabilidade do git.
Recentemente, também fiz um script bash para esse propósito (Apêndice A), que envolve um pouco de segurança em torno dessa operação.
Nota:
Se o seu repo tiver submódulos, esse processo irá bagunçá-los de alguma forma, e a única solução que encontrei até agora é excluí-los e, em seguida, usar
git submodule update --init
(ou recriar o repo, mas isso parece muito drástico).Apêndice A - Script completo
fonte
.git
pasta depois de fazer isso. Eu descobri quegit reset origin/master --hard
era mais útil do que--mixed
.TL; DR
Git realmente não armazena história da maneira que você pensa. Ele calcula o histórico em tempo de execução com base em uma cadeia de ancestrais. Se faltam blobs, árvores ou commits em seus ancestrais, você pode não conseguir recuperar totalmente seu histórico.
Restaurar objetos ausentes de backups
A primeira coisa que você pode tentar é restaurar os itens ausentes do backup. Por exemplo, veja se você tem um backup do commit armazenado como
.git/objects/98/4c11abfc9c2839b386f29c574d9e03383fa589
. Nesse caso, você pode restaurá-lo.Você também pode querer olhar em git-verify-pack e git-unpack-objects no caso de o commit já ter sido empacotado e você deseja devolvê-lo a um objeto solto para fins de cirurgia de repositório.
Ressecção Cirúrgica
Se você não puder substituir os itens ausentes de um backup, poderá eliminar o histórico ausente. Por exemplo, você pode examinar seu histórico ou reflog para encontrar um ancestral do commit 984c11abfc9c2839b386f29c574d9e03383fa589. Se você encontrar um intacto, então:
Se funcionar, você perderá a história intermediária. Neste ponto, se você tem um log de histórico de trabalho, então é uma boa idéia podar seu histórico e reflogs de todos os commits e objetos inacessíveis.
Restaurações completas e reinicialização
Se o seu repositório ainda estiver quebrado, então esperamos que você tenha um backup ou clone não corrompido do qual possa restaurar. Caso contrário, mas seu diretório de trabalho atual contém arquivos válidos, então você sempre pode reinicializar o Git. Por exemplo:
É drástico, mas pode ser sua única opção se o histórico do seu repositório for realmente irrecuperável. YMMV.
fonte
error: Could not read abcde
Meu repo é gerenciado pelo GitLab e ele estava criando arquivos que meu usuário não conseguia ler. Umsudo chown
depois e eu estava pronto para ir.Se você tiver um controle remoto configurado e não se preocupa / não quer perder algum código não enviado, você pode fazer:
fonte
fatal: pack has 13 unresolved deltas
.Aqui está um script (bash) para automatizar a primeira solução por @CodeGnome para restaurar a partir de um backup (executado a partir do nível superior do repo corrompido). O backup não precisa ser concluído, ele só precisa ter os objetos ausentes.
fonte
Antes de tentar qualquer uma das correções descritas nesta página, aconselho fazer uma cópia do seu repo e trabalhar apenas nesta cópia. Então, no final, se você puder consertá-lo, compare-o com o original para garantir que nenhum arquivo foi perdido no processo de reparo.
Outra alternativa que funcionou para mim foi redefinir o git head e index para seu estado anterior usando:
git reset --keep
Você também pode fazer o mesmo manualmente abrindo a GUI do Git e selecionando cada "Mudanças em estágios" e clicando em "Tirar o estágio da mudança". Quando tudo não estiver encenado, você agora deve ser capaz de compactar seu banco de dados, verificar seu banco de dados e confirmar.
Eu também tentei os seguintes comandos, mas eles não funcionaram para mim, mas podem ser para você, dependendo do seu problema exato:
Finalmente, para evitar que esse problema de sincronização danifique seu índice git (o que pode acontecer com DropBox, SpiderOak ou qualquer outro disco em nuvem), você pode fazer o seguinte:
.git
pasta em um único arquivo git "agrupado" usando :,git bundle create my_repo.git --all
então ele deve funcionar da mesma forma que antes, mas como tudo está em um único arquivo, você não correrá mais o risco de a sincronização danificar seu repositório git.fonte
Se você está desesperado, pode tentar o seguinte:
Ele obterá seus dados, mas você perderá o histórico. Fui com tentativa e erro em meu repo e
--depth=10
funcionou, mas--depth=50
me deu um fracasso.fonte
Tentei afastar os arquivos-objeto com 0 bytes e buscá-los novamente no controle remoto, e funcionou:
Ele buscou os objetos ausentes do controle remoto e me permitiu continuar trabalhando sem reinicializar todo o repositório.
fonte
Eu estava enfrentando o mesmo problema, então substituí a pasta ".git" por uma versão de backup e ainda não estava funcionando porque o arquivo .gitconfig estava corrompido. O BSOD do meu laptop o corrompeu. Substituí-o pelo seguinte código e o sourcetree restaurou todos os meus repositórios.
Não sei se isso vai ajudar alguém, mas esta é apenas mais uma solução que funcionou para mim.
fonte
Remova o índice e reinicie
fonte
Recentemente, experimentei problemas semelhantes usando o git versão 2.7.1 no Ubuntu 18.04.3. Aqui está como eu fiz:
Na maioria das vezes, o processo de recuperação foi bem-sucedido
fonte
No meu caso, estava criando o repositório a partir do código fonte já no meu pc e apareceu aquele erro. Excluí a pasta .git, fiz tudo de novo e funcionou :)
fonte
Eu queria adicionar isso como um comentário na resposta incrível de Zoey Hewil acima, mas no momento não tenho representantes suficientes para fazer isso, então tenho que adicioná-lo aqui e dar crédito por seu trabalho: P
Se você estiver usando Poshgit e estiver se sentindo excepcionalmente preguiçoso, você pode usar o seguinte para extrair automaticamente sua URL de sua configuração git e tornar um trabalho fácil ainda mais fácil. Advertências padrão se aplicam sobre como testar isso em uma cópia / backup de seu repositório local primeiro, para o caso de explodir na sua cara.
fonte
Maneira rápida se você tiver uma mudança em seu projeto atual e não quiser perdê-lo, mova seu projeto atual para algum lugar, clone o projeto do github para esta pasta e faça algumas alterações e tente fazer um commit novamente. Ou apenas exclua o repo e clone-o novamente, funcionou para mim.
fonte
Este comando funcionou para mim:
fonte