git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Recovering from missing objects?

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 20, 2009, 00:29 UTC
Message-ID
<7vvdr6j6hz.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<alpine.LRH.2.00.0902191447040.16988@vixen.sonytel.be>
Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com> writes:
Show 32 quoted lines
> 	Hi all,
>
> I start to see suspicious messages about missing objects in one of my working
> repositories:
>
> | vixen$ git gc
> | error: Could not read c406ab0be69c912ea59233595a071478103cdad8
> | fatal: bad tree object c406ab0be69c912ea59233595a071478103cdad8
> | error: failed to run repack
> | vixen$ 
>
> My setup:
>   - I have one reference repository (cloned from Linus' linux-2.6.git)
>   - I have several working repositories, cloned using --reference to my
>     reference repository. A working repository has several remotes (cloned from
>     other Linux kernel repositories).
>
> I always do a `git pull' in the reference repository, before doing a `git
> remote update' in a working repository. When I do `git gc' in a working
> repository, it cleans up all objects that are not in the reference repository.
> Hence I only need to care about backup of the .git directories in the working
> repositories (the stuff I'm working on), and not about the reference
> repository (its objects are publicly available and replicated all over the
> world).
>
> I identified the missing object listed above to be part of a remote repository.
> Doing a `git remote update' doesn't fetch it again, as git is too smart and
> thinks I already have everything.
>
> If I clone the remote repository, I have the object in the new clone.
> However, how do I get the missing object back into the .git directory of my
> working repository?
In the new clone:
	$ IT=c406ab0be69c912ea59233595a071478103cdad8
	$ TYPE=$(git cat-file -t $IT)
        $ git cat-file $TYPE $IT >/var/tmp/$IT.raw
Go to the repository that lacks the object and then
	$ git hash-object -t $TYPE -w --stdin </var/tmp/$IT.raw

After that you may find objects that $IT needs to reference. You can obviously repeat the above procedure until you have nothing missing.

I also suspect you could do this instead; I haven't thought things through and that is why I say "suspect" but this is safe (i.e. not destructive) and may worth a try.

In the new clone:
	$ IT=c406ab0be69c912ea59233595a071478103cdad8
	$ H=$(git rev-list --objects $IT | git pack-objects mine)
        $ mv mine-$H.pack /var/tmp
Go to the repository that lacks the object and then
	$ git unpack-objects </var/tmp/mine-$H.pack
Previous: Geert UytterhoevenNext: Jeff King
Message 2 of 6 in “Recovering from missing objects?”
  1. Geert UytterhoevenFeb 19, 2009
  2. Junio C HamanoFeb 20, 2009
  3. Jeff KingFeb 20, 2009
  4. Junio C HamanoFeb 20, 2009
  5. Jeff KingFeb 20, 2009
  6. Geert UytterhoevenFeb 20, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.