将损坏的松散对象修复为git中的提交

时间:2012-09-24 19:28:32

标签: git

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

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 it。

现在,我从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,我发现如何解决这个问题,但如果是提交则不会。

6 个答案:

答案 0 :(得分:17)

首先,备份现有存储库。 cp -r或其他什么。这样,如果您尝试修复存​​储库会使其更糟,您可以恢复。

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:4)

非常类似于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更多的丢失对象,所以最好在清理它们之前将恢复目录保留一段时间。

答案 3 :(得分:0)

对于遇到此问题的任何人,只需简单回答此问题: git clone 命令是修复,如果有远程仓库然后将其克隆到本地文件夹(删除损坏的本地仓库后),万一你没有远程仓库然后尝试推送损坏的仓库到github,然后从那里克隆它,我认为损坏的对象不会被推,它将解决问题

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

如果您自己运行git项目,并且可以为此牺牲git历史,那么请删除Git并使用以下命令将其重新初始化:

# remove git from the folder
git rm -rf .git

# reinitialize the Git system
git init

# commit for push
git commit -m "new commits"

#re-add the remote origin
git remote add origin https://github.com/path/to-git.git

# push with force, so git doesn't complain about code clash.
git push origin master --force