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

Wil*_*ll. 20 git

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

user@thismachine:~/file/path$ git add *
user@thismachine:~/file/path$ git push 
^C
user@thismachine:~/file/path$ git commit -m "my commitmesg"
Run Code Online (Sandbox Code Playgroud)

(我惊慌失措,因为我在推动之前忘了添加一个提交,所以我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)
Run Code Online (Sandbox Code Playgroud)

git cat-file -t 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a返回此对象是提交.

搜索之后,我发现如果对象是blob,如何解决这个问题,而不是如果它是一个提交.

sak*_*ias 26

来自http://vincesalvino.blogspot.ca/2013/08/git-empty-files-corrupt-objects-and.html的解决方案让我解决了这个问题:

find .git/objects/ -size 0 -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

  • 这让我"致命:无法解析HEAD" (9认同)
  • 查找.git / objects / -size 0 -delete怎么样? (2认同)
  • 如果你愿意牺牲当前的分支,这似乎有效.如果文件的损坏发生在master中,你几乎搞砸了. (2认同)

Sch*_*ern 17

首先,备份现有存储库. cp -r或者其他的东西.这样,如果你试图修复你的存储库搞砸了,你可以恢复.

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

  • 对象被打包了.使用`git unpack-objects .git/objects/pack/*.pack`将它们解压缩到单个文件中. (7认同)
  • 如果您正在使用@ Schwern的解决方案,并且您似乎没有做正确的论证,(a)确保您当然位于存储库的顶部,并且(b)尝试`git unpack-objects <. git/objects/pack/*.pack`(注意重定向箭头). (3认同)
  • 如果git unpack-objects命令不执行任何操作"**如果**在目标存​​储库中存在的包文件上使用此命令,则不会解压缩任何内容." ([git docs](http://git-scm.com/docs/git-unpack-objects)).要解压缩对象,只需使用`git init`创建一个新的repo,然后运行该命令从您刚创建的存储库中解压缩包文件(来自克隆的存储库). (2认同)

Wil*_*ll. 8

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

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


Pau*_*ver 5

与 Schwerm 的回答非常相似,但我必须初始化一个新的存储库来解压.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
Run Code Online (Sandbox Code Playgroud)

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