Fixing Git

Jacob Allred
#linux

I use git as my version control system for all of my sites. It helps to reduce disk usage by occasionally running git gc. Last night when I went to run git gc on one of my sites, I received a message I had never seen before telling me that my git repo was corrupt. Corrupt? Oh noes!

So I searched the internet and discovered I could run git fsck —full to figure out what the problem was:

$ git fsck --full
broken link from    tree e79ab5efffca93a784afdb9cef73801eb1fa9db4
              to    tree fb9d707c76dde3f8cb672d1c07ca046615175587
dangling tree 1003e43ee3725b0482193aea9d82ca527c2903cc
dangling blob 361211b552b7910299e63b6627944ff72b0577eb
dangling blob 8e79df8dbe87431fbec8f25a4c6527fabe4d9e6f
dangling blob 9b3a891e5094920f743c36a49d1647d9aad2b2f0
missing tree fb9d707c76dde3f8cb672d1c07ca046615175587

After digging around the internet, I discovered that my repo was missing a tree, and that I could get it out of a cloned copy of the repo, assuming the cloned copy wasn’t corrupt, too.

I created a new empty repo:

$ mkdir new-repo
$ cd new-repo
$ git init

Next, I copied my pack file from the good repo to the new empty repo (there was only one in my pack folder):

$ cd /www/path/to/good/repo
$ cp .git/objects/pack/pack-c376dc3b9d2ce5f4d9ab9269d29ddc82f6f6a822.pack /path/to/new-repo

I unpacked the pack file to see if I could find the missing tree:

$ cd /path/to/new-repo
$ git unpack-objects < pack-c376dc3b9d2ce5f4d9ab9269d29ddc82f6f6a822.pack

My missing tree is fb9d707c76dde3f8cb672d1c07ca046615175587, so I looked to see if my file was there:

$ cd .git/objects/fb/
$ ls -l

9d707c76dde3f8cb672d1c07ca046615175587 showed up in the list, so yay! My missing tree was there! Now to copy it to the corrupt repo (my corrupt repo was a bare repo, so no .git in the path):

$ mkdir -p /path/to/corrupt/repo/objects/fb
$ cp /path/to/new-repo/.git/objects/fb/9d707c76dde3f8cb672d1c07ca046615175587 /path/to/corrupt/repo/objects/fb/9d707c76dde3f8cb672d1c07ca046615175587

That was it for me! I ran git gc and everything worked without a problem.

Hopefully this helps someone, or at least will help me remember what the heck to do next time my repo gets corrupted.