22

在收到此错误之前,我立即执行了以下操作:

user@thismachine:~/file/path$ git add *
user@thismachine:~/file/path$ git push 
^C
user@thismachine:~/file/path$ git commit -m "my commitmesg"

(我惊慌失措,因为我忘记在推送之前添加一个提交,所以我 cntrl+c'ed 它。

现在,我收到以下错误git fsck --full

error: inflate: data stream error (incorrect header check)
error: corrupt loose object '5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a'
fatal: loose object 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a (stored in .git/objects/5c/deb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a)

git cat-file -t 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a 返回这个对象是一个提交。

搜索后,我发现如果对象是blob,但如果它是提交,则无法解决此问题。

4

6 回答 6

34

http://vincesalvino.blogspot.ca/2013/08/git-empty-files-corrupt-objects-and.html的解决方案允许我解决问题:

find .git/objects/ -size 0 -exec rm -f {} \;
于 2015-08-25T01:04:34.530 回答
20

首先,备份您现有的存储库。 cp -r或者其他的东西。这样,如果您尝试修复存​​储库将其搞砸,您可以恢复。

最简单的尝试是将损坏的目标文件替换为工作文件。如果您有存储库的备份,请使用它。否则,git clone从您的远程存储库中获取一个新副本并复制.git/objects/5c/deb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a到您现有的损坏的副本中。看看能不能解决。

于 2012-09-24T19:37:30.973 回答
8

感谢您的回复。我在新的克隆存储库中运行它并返回它解压缩了 100% 的对象,但是它们不在该存储库的 .git/objects/pack 中。

所以,今天早上尝试了一些有效的方法。1. 将我的 github 存储库克隆到一个单独的新目录中。2. 将本地更改的文件(我最初想提交的)复制到我的新克隆存储库中,然后将它们推送到 github。3. 核对我的旧本地存储库并 4. 再次将其克隆到与旧存储库相同的文件路径。

于 2012-09-25T13:21:36.310 回答
5

与 Schwerm 的回答非常相似,但我必须初始化一个新的 repo 来解压.pack文件:

git clone <repo-uri> my_repo.fresh_clone
mkdir my_repo.newly_unpacked
cd !$
git init
for pack_file in ../my_repo.fresh_clone/.git/pack/*.pack; do
    git unpack-objects < $pack_file
done

my_repo.newly_unpacked/.git/objects/<xx>/<sha1>然后我按照错误消息的指示复制了文件。我被抓住了,因为一些操作,例如git checkout比简单的显示更多丢失的对象git status,所以最好在清理它们之前将恢复目录保留一段时间。

于 2015-06-16T22:15:19.257 回答
0

对于遇到此问题的任何人,此问题的简单答案:git clone命令是解决方法,如果有远程存储库,则将其克隆到本地文件夹(删除损坏的本地存储库后),以防万一您没有远程存储库,然后尝试将损坏的 repo 推送到 github,然后从那里克隆它,我认为损坏的对象不会被推送,它将解决问题

于 2014-08-14T08:29:21.610 回答
-2

当系统在提交之前崩溃时,我遇到了类似的问题。幸运的是,我所要做的就是将完整的 repo 再次克隆到一个新目录并丢弃旧目录。

新克隆的 repo 没有损坏的 .git/objects/#num/#hash 文件。

于 2016-05-19T14:40:11.237 回答