Git adventures: Loose object is corrupted

I couldn't read my Git history today because I ran into this problem:

$ git log --oneline
f1330fd Basic automation
7234c6e Textures work
3b18493 Fix combo defaults
error: inflate: data stream error (incorrect data check)
fatal: loose object 65d626bb82c8996f8fc5f659f7c207fee1d74948 (stored in .git/objects/65/d626bb82c8996f8fc5f659f7c207fee1d74948) is corrupted

The same message appeared when checking the repository with git fsck.

My working copy and dozens of last commits were intact; this error showed up when trying to view more history or when trying to clone a repo. Some googling revealed that I should get the original (non-corrupted) object from somewhere and replace it.

I removed the corrupted object:

mv .git/objects/65/d626bb82c8996f8fc5f659f7c207fee1d74948 someplace/away

Just this allowed git fsck to complete and reveal, among the usual dangling objects, this message:

missing commit 65d626bb82c8996f8fc5f659f7c207fee1d74948

Oh, so it's a commit! That makes sense. I plugged in a pendrive with a backup (which was another bare repository) and made a fresh clone. There, running git show worked there - that's some good news, because the thing that got corrupted is in my backup.

$ git show 65d626bb82c8996f8fc5f659f7c207fee1d74948
commit 65d626bb82c8996f8fc5f659f7c207fee1d74948
Author: Tomasz Wesolowski <kosashi@gmail.com>
Date:   Sat Jan 12 13:17:12 2013 +0100

    Editor improvements

(the diff followed)

My first idea was to add the broken repository as a remote, fetch new commits from it and continue the work from there. This had failed initially (before removing the corrupted object):

$ git remote add broken d:/werk/mgr.broken
$ git fetch broken
error: inflate: data stream error (incorrect data check)
fatal: loose object 65d626bb82c8996f8fc5f659f7c207fee1d74948 (stored in ./objects/65/d626bb82c8996f8fc5f659f7c207fee1d74948) is corrupt
fatal: The remote end hung up unexpectedly

No success; However I later noticed that simply removing the corrupted object file made the fetch work.

I decided to simply copy the uncorrupted object file from the backup's clone to my original repository. This worked just as well. (By the way: If you can't find the object in .git/objects/ by its name, it probably has been [packed][pack] to conserve space.)

Why exactly had this happened? I have no idea, but my PC has been surprising me in many funny ways recently, so for now I'm just grateful I make it boot every day. :)

Some reading that helped me: