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

Re: [PATCH 00/15] git-note: A mechanisim for providing free-form after-the-fact annotations on commits

From
Shawn O. Pearce <spearce@spearce.org>
Date
May 28, 2007, 21:35 UTC
Message-ID
<20070528213511.GB7044@spearce.org>
In-Reply-To
<7vwsysbrtg.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> wrote:
Show 16 quoted lines
> Johan Herland <johan@herland.net> writes:
> > Ok. But the reverse mapping will help with this, won't it?
> > We'll look up the interesting commits and find their associated
> > note objects directly.
> 
> The issue Linus brought up worries me, too.
> 
> The "efficient reverse mapping" is still handwaving at this
> stage.  What it needs to do is an equivalent to your
> implementation with "refs/notes/<a dir per commit>/<note>".  The
> "efficient" one might do a flat file that says "notee note" per
> line sorted by notee, or it might use BDB or sqlite, but the
> amount of the data and complexity of the look-up is really the
> same.  A handful notes per each commit in the history (I think
> Linus's "Acked-by after the fact" example a very sensible thing
> to want from this subsystem).

Please, don't use BDB or sqllite. I really don't trust either. I've lost data to both. I've *never* lost data to a Git packfile. ;-)

I'm actually thinking pack v4. OK, I know its just a virtual hand waving thing still, but there's really no reason Nico and I cannot get the damn thing finished before we both wind up buying the farm.

What if we use a "slow" storage by "refs/notes/$objname/$notename", and we also allow them to appear in the packed-refs file. But during a repack we instead stick the annotations into the same packfile as $objname, and we also include a list of $notename after $objname's other data.

This way we have quick access to the $notename(s) of all notes of $objname through the pack, and we can lazily go get the notes raw data if we need them. This isn't too different from what we do with parent fields. We initialize the commit_list when we parse the commit but we don't parse the parents until we really need them.

Once packed we delete the note ref (if loose) and during a repack of the packed-refs file we delete the note if $notename exists in the packfile.

If someone wants notes we can check to see if refs/notes exists; if it does then we enumerate all refs and catalog the notes we found in memory. Note search then works off the in-memory list and off the packfiles. If refs/notes doesn't exist (and we should delete it when we prune away those ref files or prune them out of packed-refs) then we can skip the ref enumeration and just go straight to the packfile(s). Most notes will be in the packfiles. I think most people repack often enough that the handful of unpacked notes before the next repack won't be a major bottleneck. Especially since we can get the target $objname directly from a readdir() call, or by splitting the string in the packed-refs file.

>From an object enumeration standpoint during packfile generation

the notes for a given object are treated like the parent fields in a commit; they come after the object itself, but unlike the parent fields they are always output if the object itself was output. (Hence an --objects-edge enumeration would include the notes only if the commit itself had been included.)

Unfortunately that doesn't cover the case of a note being added months later and needing to distribute it to clients that already have the object the note is attached to.

I haven't been following this discussion very closely, but I'd also like to suggest that if annotated tags are being used for notes that the "tag <name>" field be left out of them. I don't see why a note should be given a specific name that sits in a (roughly) global namespace.

-- 
Shawn.
Previous: Junio C HamanoNext: Johannes Schindelin
Message 36 of 53 in “[RFC] Second parent for reverts”
  1. Daniel BarkalowMay 9, 2007
  2. Johannes SchindelinMay 9, 2007
  3. Shawn O. PearceMay 9, 2007
  4. Johan HerlandMay 9, 2007
  5. Junio C HamanoMay 9, 2007
  6. Linus TorvaldsMay 9, 2007
  7. Linus TorvaldsMay 10, 2007
  8. Johan HerlandMay 10, 2007
  9. Linus TorvaldsMay 10, 2007
  10. 00/15 git-note: A mechanisim for providing free-form after-the-fact annotations on commitsJohan Herland, May 27, 2007
  11. 01/15 git-note: Add git-note command for adding/listing/deleting git notesJohan Herland, May 27, 2007
  12. 02/15 git-note: (Documentation) Add git-note manual pageJohan Herland, May 27, 2007
  13. 03/15 git-note: (Administrivia) Add git-note to Makefile, .gitignore, etc.Johan Herland, May 27, 2007
  14. 04/15 git-note: (Plumbing) Add plumbing-level support for git notesJohan Herland, May 27, 2007
  15. 05/15 git-note: (Plumbing) Add support for git notes to git-rev-parse and git-show-refJohan Herland, May 27, 2007
  16. 06/15 git-note: (Documentation) Explain the new '--notes' option to git-rev-parse and git-show-refJohan Herland, May 27, 2007
  17. 07/15 git-note: (Almost plumbing) Add support for git notes to git-pack-refs and git-fsckJohan Herland, May 27, 2007
  18. 08/15 git-note: (Decorations) Add note decorations to "git-{log,show,whatchanged} --decorate"Johan Herland, May 27, 2007
  19. 09/15 git-note: (Documentation) Explain new behaviour of --decorate in git-{log,show,whatchanged}Johan Herland, May 27, 2007
  20. 10/15 git-note: (Transfer) Teach git-clone how to clone notesJohan Herland, May 27, 2007
  21. 11/15 git-note: (Transfer) Teach git-fetch to auto-follow notesJohan Herland, May 27, 2007
  22. 12/15 git-note: (Transfer) Teach git-push to push notes when --all or --notes is givenJohan Herland, May 27, 2007
  23. 13/15 git-note: (Documentation) Explain the new --notes option to git-pushJohan Herland, May 27, 2007
  24. 14/15 git-note: (Tests) Add tests for git-note and associated functionalityJohan Herland, May 27, 2007
  25. 15/15 git-note: Add display of notes to gitkJohan Herland, May 27, 2007
  26. Junio C HamanoMay 27, 2007
  27. Johan HerlandMay 28, 2007
  28. Jakub NarebskiMay 28, 2007
  29. Linus TorvaldsMay 28, 2007
  30. Johan HerlandMay 28, 2007
  31. Linus TorvaldsMay 28, 2007
  32. Johan HerlandMay 28, 2007
  33. Linus TorvaldsMay 28, 2007
  34. Johan HerlandMay 28, 2007
  35. Junio C HamanoMay 28, 2007
  36. Shawn O. PearceMay 28, 2007
  37. Johannes SchindelinMay 28, 2007
  38. Linus TorvaldsMay 29, 2007
  39. Shawn O. PearceMay 29, 2007
  40. Jakub NarebskiMay 29, 2007
  41. Andy ParkinsMay 29, 2007
  42. Johannes SchindelinMay 29, 2007
  43. Johan HerlandMay 29, 2007
  44. Jeff KingMay 29, 2007
  45. Johan HerlandMay 29, 2007
  46. Junio C HamanoMay 28, 2007
  47. Shawn O. PearceMay 28, 2007
  48. Add fsck_verify_ref_to_tag_object() to verify that refname matches name stored in tag objectJohan Herland, May 28, 2007
  49. Michael S. TsirkinMay 28, 2007
  50. Michael S. TsirkinMay 28, 2007
  51. Johan HerlandMay 28, 2007
  52. Martin LanghoffMay 10, 2007
  53. Junio C HamanoMay 10, 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.