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

grafts+repack+prune = history at danger

From
Johannes Sixt <j.sixt@eudaptics.com>
Date
Jan 25, 2007, 17:17 UTC
Message-ID
<45B8E61E.C9C5E6C6@eudaptics.com>

Isn't there a major hole in the logic how repack works when grafts are in effect?

I did this (details follow):
1. specify grafts
2. repack
3. prune
4. clone
Result: Broken history in the clone; info/grafts was not copied.
This is with git version 1.5.0.rc2.g18af.
1. I imported a cvs repository into git and "fixed" the history using
grafts. In particular:
      o--B--X   <== this commit is should be skipped
          \  \
graft =>   ---A--o

I specified in .git/info/grafts that the parent of A should be B. Of course, commit A has still recorded X as its parent.

2. Then I repacked the repo. But this did not erase all objects:

$ git repack -a -d $ git count-objects -v count: 5 size: 28 in-pack: 3392 packs: 1 prune-packable: 0 garbage: 0 $ git fsck-objects dangling commit bb828bfbd213a97817a95506bab4eeaa70538e2e

This commit bb828... is X.
3. Now git prune happily removes the 5 objects.
4. 'git clone First Second' clones the repository without problems.

But now in the clone the history is kaputt. Because commit X is not in the cloned pack. Nor is there any info/grafts file. The original history is still OK as long as the info/grafts file is present; but if it is removed, the original repo is also damaged.

IMHO, this is a very serious issue. I think that repack should not walk the grafted history. Alternatively, the info/grafts file must be copied by the clone and respected by fsck-objects.

-- Hannes
Next: Junio C Hamano
Message 1 of 15 in “grafts+repack+prune = history at danger”
  1. Johannes SixtJan 25, 2007
  2. Junio C HamanoJan 25, 2007
  3. Johannes SixtJan 26, 2007
  4. Junio C HamanoJan 26, 2007
  5. Johannes SixtJan 26, 2007
  6. Junio C HamanoJan 26, 2007
  7. Johannes SixtJan 26, 2007
  8. Junio C HamanoJan 26, 2007
  9. Johannes SixtJan 26, 2007
  10. Junio C HamanoJan 26, 2007
  11. Jakub NarebskiJan 26, 2007
  12. Linus TorvaldsJan 26, 2007
  13. Junio C HamanoJan 26, 2007
  14. Linus TorvaldsJan 27, 2007
  15. Mark WoodingJan 26, 2007

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.