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

Re: Git and GCC

From
Linus Torvalds <torvalds@linux-foundation.org>
Date
Dec 6, 2007, 19:39 UTC
Message-ID
<alpine.LFD.0.9999.0712061118050.13796@woody.linux-foundation.org>
In-Reply-To
<1196968371.18340.30.camel@ld0161-tx32>
On Thu, 6 Dec 2007, Jon Loeliger wrote:
Show 10 quoted lines
>
> On Thu, 2007-12-06 at 00:09, Linus Torvalds wrote:
> > Git also does delta-chains, but it does them a lot more "loosely". There 
> > is no fixed entity. Delta's are generated against any random other version 
> > that git deems to be a good delta candidate (with various fairly 
> > successful heursitics), and there are absolutely no hard grouping rules.
> 
> I'd like to learn more about that.  Can someone point me to
> either more documentation on it?  In the absence of that,
> perhaps a pointer to the source code that implements it?
Well, in a very real sense, what the delta code does is:
 - just list every single object in the whole repository
 - walk over each object, trying to find another object that it can be 
   written as a delta against
 - write out the result as a pack-file

That's simplified: we may not walk _all_ objects, for example: only a global repack does that (and most pack creations are actually for pushign and pulling between two repositories, so we only walk the objects that are in the source but not the destination repository).

The interesting phase is the "walk each object, try to find a delta" part. In particular, you don't want to try to find a delta by comparing each object to every other object out there (that would be O(n^2) in objects, and with a fairly high constant cost too!). So what it does is to sort the objects by a few heuristics (type of object, base name that object was found as when traversing a tree and size, and how recently it was found in the history).

And then over that sorted list, it tries to find deltas between entries that are "close" to each other (and that's where the "--window=xyz" thing comes in - it says how big the window is for objects being close. A smaller window generates somewhat less good deltas, but takes a lot less effort to generate).

The source is in git/builtin-pack-objects.c, with the core of it being
 - try_delta() - try to generate a *single* delta when given an object 
   pair.
 - find_deltas() - do the actual list traversal
 - prepare_pack() and type_size_sort() - create the delta sort list from 
   the list of objects.
but that whole file is probably some of the more opaque parts of git.
> I guess one question I posit is, would it be more accurate
> to think of this as a "delta net" in a weighted graph rather
> than a "delta chain"?

It's certainly not a simple chain, it's more of a set of acyclic directed graphs in the object list. And yes, it's weigted by the size of the delta between objects, and the optimization problem is kind of akin to finding the smallest spanning tree (well, forest - since you do *not* want to create one large graph, you also want to make the individual trees shallow enough that you don't have excessive delta depth).

There are good algorithms for finding minimum spanning trees, but this one is complicated by the fact that the biggest cost (by far!) is the calculation of the weights itself. So rather than really worry about finding the minimal tree/forest, the code needs to worry about not having to even calculate all the weights!

(That, btw, is a common theme. A lot of git is about traversing graphs, like the revision graph. And most of the trivial graph problems all assume that you have the whole graph, but since the "whole graph" is the whole history of the repository, those algorithms are totally worthless, since they are fundamentally much too expensive - if we have to generate the whole history, we're already screwed for a big project. So things like revision graph calculation, the main performance issue is to avoid having to even *look* at parts of the graph that we don't need to see!)

			Linus
Previous: Jon LoeligerNext: Jakub Narebski
Message 74 of 89 in “Re: Git and GCC”
  1. David MillerDec 6, 2007
  2. Daniel BerlinDec 6, 2007
  3. David MillerDec 6, 2007
  4. Daniel BerlinDec 6, 2007
  5. David MillerDec 6, 2007
  6. Harvey HarrisonDec 6, 2007
  7. Daniel BerlinDec 6, 2007
  8. David MillerDec 6, 2007
  9. Daniel BerlinDec 6, 2007
  10. Harvey HarrisonDec 6, 2007
  11. Daniel BerlinDec 6, 2007
  12. Jon SmirlDec 6, 2007
  13. Jeff KingDec 6, 2007
  14. Nicolas PitreDec 6, 2007
  15. Jeff KingDec 6, 2007
  16. Nicolas PitreDec 6, 2007
  17. Jeff KingDec 7, 2007
  18. Jeff KingDec 7, 2007
  19. Linus TorvaldsDec 6, 2007
  20. Jon SmirlDec 6, 2007
  21. Nicolas PitreDec 6, 2007
  22. Jon SmirlDec 6, 2007
  23. Nicolas PitreDec 6, 2007
  24. Jon SmirlDec 6, 2007
  25. Jon SmirlDec 6, 2007
  26. Nicolas PitreDec 6, 2007
  27. Jon SmirlDec 6, 2007
  28. Jeff KingDec 7, 2007
  29. Harvey HarrisonDec 8, 2007
  30. Gabriel PaubertDec 10, 2007
  31. Nicolas PitreDec 10, 2007
  32. David MillerDec 7, 2007
  33. Jeff KingDec 7, 2007
  34. Jon SmirlDec 7, 2007
  35. David MillerDec 7, 2007
  36. Linus TorvaldsDec 7, 2007
  37. Giovanni BajoDec 7, 2007
  38. Jakub NarebskiDec 7, 2007
  39. Luke LuDec 7, 2007
  40. Giovanni BajoDec 7, 2007
  41. Daniel BerlinDec 7, 2007
  42. Johannes SchindelinDec 8, 2007
  43. David MillerDec 8, 2007
  44. David MillerDec 10, 2007
  45. Linus TorvaldsDec 6, 2007
  46. Harvey HarrisonDec 6, 2007
  47. David BrownDec 6, 2007
  48. Nicolas PitreDec 6, 2007
  49. gc --aggressive: make it really aggressiveJohannes Schindelin, Dec 6, 2007
  50. Theodore TsoDec 6, 2007
  51. Nicolas PitreDec 6, 2007
  52. Pierre HabouzitDec 6, 2007
  53. Johannes SchindelinDec 6, 2007
  54. David KastrupDec 6, 2007
  55. Harvey HarrisonDec 6, 2007
  56. Johannes SchindelinDec 6, 2007
  57. Linus TorvaldsDec 6, 2007
  58. Johannes SchindelinMar 18, 2009
  59. Teemu LikonenMar 18, 2009
  60. Nicolas PitreMar 18, 2009
  61. Daniel BerlinDec 6, 2007
  62. Linus TorvaldsDec 6, 2007
  63. Harvey HarrisonDec 7, 2007
  64. Linus TorvaldsDec 7, 2007
  65. Jon SmirlDec 7, 2007
  66. Nicolas PitreDec 7, 2007
  67. Linus TorvaldsDec 7, 2007
  68. Jon SmirlDec 7, 2007
  69. Nicolas PitreDec 7, 2007
  70. NightStrikeDec 6, 2007
  71. Linus TorvaldsDec 6, 2007
  72. NightStrikeDec 7, 2007
  73. Jon LoeligerDec 6, 2007
  74. Linus TorvaldsDec 6, 2007
  75. Jakub NarebskiDec 7, 2007
  76. Junio C HamanoDec 6, 2007
  77. Junio C HamanoDec 6, 2007
  78. David KastrupDec 6, 2007
  79. [OT] Re: Git and GCCRandy Dunlap, Dec 6, 2007
  80. Harvey HarrisonDec 6, 2007
  81. Linus TorvaldsDec 6, 2007
  82. Harvey HarrisonDec 6, 2007
  83. Johannes SchindelinDec 6, 2007
  84. Ismail DönmezDec 6, 2007
  85. "Argument list too long" in git remote update (Was: Git and GCC)Geert Bosch, Dec 17, 2007
  86. Johannes SchindelinDec 17, 2007
  87. Linus TorvaldsDec 17, 2007
  88. Derek FawcusDec 18, 2007
  89. Shawn O. PearceDec 18, 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.