每当我从我的遥控器,我得到以下关于压缩的错误。当我运行手动压缩,我得到相同的:

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

有人知道该怎么做吗?

从cat文件中我得到了这个:

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

从git fsck中我得到了这个(不知道它是否真的相关):

$ 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

有人能帮我解读一下吗?


当前回答

对我来说,这是由于在做git推时发生的电源故障。

这些信息是这样的:

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

我尝试了git fsck之类的东西,但这没有帮助。 由于崩溃发生在git推送期间,它显然发生在客户端重写期间,发生在服务器更新之后。我环顾四周,发现c2388在我的例子中是一个提交对象,因为它是由.git/refs中的条目引用的。所以我知道,当我查看历史(通过web界面或第二个克隆)时,我将能够找到c2388。

在第二个克隆中,我执行了git log -n 2 c2388来识别c2388的前身。然后我手动修改了.git/refs/heads/master和.git/refs/remotes/origin/master作为c2388的前身,而不是c2388。 然后我可以进行git取回。 git获取失败了几次,因为空对象上的冲突。我删除了这些空对象,直到git获取成功。这已经修复了存储库。

其他回答

在我的(Windows)机器决定重新启动后,我得到了这个错误。

谢天谢地,我的远程存储库是最新的,所以我只是做了一个新的Git克隆…

我没有失去其他未被推的树枝: 对破碎对象的引用应该在refs/heads/<current_branch>中。如果你转到。git\logs\refs\heads\<current_branch>,你可以看到上次提交的值完全相同。我将之前提交的文件复制到第一个文件中,它解决了这个问题。

我犯了完全相同的错误,并设法在不丢失更改的情况下取回了我的回购。

我不知道这是否适用于其他人,因为腐败的原因可能是多方面的,但值得一试

I:

为以防万一,对损坏的git存储库进行了多次备份 从远程存储库克隆最近的推送版本 从损坏的。git文件夹中复制了所有文件,除了所有与HEAD, FETCH_HEAD, ORG_HEAD等相关的文件…最重要的是refs, obj和index 最终得到了一个有效的历史记录,但腐败的索引,应用了这篇文章的解决方案如何解决“错误:坏索引-致命:索引文件腐败”时使用Git

我的存储库又开始工作了……

为了确保我没有推送任何错误,我再次从远程复制,检出我想要从恢复的存储库保存的更改,并将它们提交为新的。

您不需要克隆,也不需要丢失未提交的更改。只需使用git rm -rf .git/删除。git文件夹,然后通过启动一个新的repo,设置remote和重置head来恢复git文件夹。我在这里添加了恢复已删除git文件夹的说明:

https://stackoverflow.com/a/67610397/7584643

user1055643的答案缺少最后一步:

rm -fr .git
git init
git remote add origin your-git-remote-url
git fetch
git reset --hard origin/master
git branch --set-upstream-to=origin/master master