How to remove "fatal: loose object"?

First, you can check the file system for errors: fsck -y

Then, check the git repository: git fsck


The idea is:

  1. first remove your current git records which reside in your .git under your current project (let's denote it by "project A").
  2. Make copy of your current project, we denote the duplicate as "project B".
  3. Now cd into project A and git clone and reset to the last commit.
  4. Copy all the files from project B and replace those in project A.
  5. Now cd into project A and use git status to see the status of project A. It should be just as if there was no corruption happened ever.

In short, make a copy to reserve your current working area, and merge it with a fresh clone by replacing files and then deal with your changes as normal.

Here's it in action:

  1. First I see I have a corruption (which is because I forced my virtual machine to shutdown inproperly yesterday :P):

    ✘ domicor@ubuntu  ~/dotfiles   master ●  git status error: object file .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 is empty error: object file .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 is empty fatal: loose object cd593f6db1d5050406e15b9c80d215fd48db39f4 (stored in .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4) is corrupt corrupted

  2. Make a copy of my dotfiles folder and now remove the .git folder.

    $ cd ~/dotfiles $ rm -rf .git

    dotfiles

  3. Then recreate a git repo.

    $ git init

  4. Add a remote.

    $ git remote add origin [email protected]:domicor/dotfiles.git

  5. Fetch from the remote.

    $ git fetch

    Here's a screen shot of the above commands:rm-clone-fetch

  6. Now reset the HEAD.

    $ git reset --hard origin/master

    This is the shot: reset

    Notice that right after I fetched from remote I issued a git status command to check out the status of my repo. You can see all the files are untracked. And the lst part of the command line prompt is orange from my git init command to git reset command indicating that when I initialized my repo, git detected files and after the reset, all files are restored to the state of the HEAD thus the green prompt.

  7. Set the upstream branch:

    $ git branch --set-upstream-to=origin/master master

  8. Now copy your files from the backup folder (for me it's dotfiles (copy)) manually or through the command line to replace files in the dotfiles folder. Check out the status and there should be changes just like my screen shot:

    final

  9. Now you can git diff your-filename to check out if your changes are applied properly and you can add files and commit from now on. \o/

To understand it furthur, the git VCS just records your changes. When the VCS is corrupted, your files are still safe. They are still there as you left them. So you backup your files and restore the git records from elsewhere and git can compare the restore copy with your current file status and have ideas about what has changed just as it did before the corruption. And cheers \o/


Easy answer: move the old repo away and reclone. If you have stuff in the old repo you want to preserve, there are ways of getting them, but first get a good repo.

Tags:

Git

Github