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

Re: detecting rename->commit->modify->commit

From
Jeff King <peff@peff.net>
Date
May 1, 2008, 23:09 UTC
Message-ID
<20080501230925.GC21731@sigill.intra.peff.net>
In-Reply-To
<20080501203940.GA3524@mithlond.arda.local>
[cc'd Junio for comments on this rename optimization]
On Thu, May 01, 2008 at 11:39:40PM +0300, Teemu Likonen wrote:
Show 5 quoted lines
> > Hmm, looking at the code, though, 50% is supposed to be the default
> > minimum. So there might actually be a bug.
> 
> I did some testing... A file, containing 10 lines (about 200 bytes),
> renamed and then modified (similarity index being a bit over 50%). Git

Ah, OK. The problem comes because the toy example is so tiny. It hits this code chunk:

  if (base_size * (MAX_SCORE-minimum_score) < delta_size * MAX_SCORE)
          return 0;

where base_size is the size of the smaller file in bytes, and delta_size is the difference between the size of the two files. This is an optimization so that we don't even have to look at the contents.

But it is basing the percentage off of the smaller file, so even though file B ("hello\nworld\n") is 50% made up of file A ("hello\n"), we actually end up saying "there must be at least as much content added to make B as there is in A already". IOW, the "percentage similarity" is based off of the smaller file for this optimization.

Obviously this is a toy case, but I wonder if there are other larger cases where you end up with a file which has substantial copied content, but also _grows_ a lot (not just changes). For example, consider the file:

  1
  2
  3
  4
  5
  6
  7
  8
  9

that is, ten lines each with a number. Now rename it, and start adding more numbers. We detect the addition of 10, 11, 12. But adding 13 means we no longer match. So even with only 4 lines added, we fail to match.

But again, this is a bit of a toy case. It relies on the line length being a significant factor compared to number of lines.

-Peff
Previous: Teemu LikonenNext: Sitaram Chamarty
Message 9 of 49 in “detecting rename->commit->modify->commit”
  1. Ittay DrorMay 1, 2008
  2. Jeff KingMay 1, 2008
  3. Ittay DrorMay 1, 2008
  4. Jeff KingMay 1, 2008
  5. Ittay DrorMay 1, 2008
  6. Jeff KingMay 1, 2008
  7. Jakub NarebskiMay 1, 2008
  8. Teemu LikonenMay 1, 2008
  9. Jeff KingMay 1, 2008
  10. Sitaram ChamartyMay 2, 2008
  11. Junio C HamanoMay 2, 2008
  12. Sitaram ChamartyMay 2, 2008
  13. Ittay DrorMay 1, 2008
  14. Jeff KingMay 1, 2008
  15. Ittay DrorMay 1, 2008
  16. Jeff KingMay 1, 2008
  17. Ittay DrorMay 1, 2008
  18. David TweedMay 1, 2008
  19. Avery PennarunMay 1, 2008
  20. Jeff KingMay 1, 2008
  21. Avery PennarunMay 1, 2008
  22. Jeff KingMay 1, 2008
  23. Avery PennarunMay 1, 2008
  24. Jeff KingMay 1, 2008
  25. Steven GrimmMay 1, 2008
  26. Jeff KingMay 1, 2008
  27. merge renamed files/directories? (was: Re: detecting rename->commit->modify->commit)Ittay Dror, May 3, 2008
  28. Avery PennarunMay 3, 2008
  29. Ittay DrorMay 4, 2008
  30. Jakub NarebskiMay 4, 2008
  31. Avery PennarunMay 5, 2008
  32. Robin RosenbergMay 5, 2008
  33. Linus TorvaldsMay 5, 2008
  34. Steven GrimmMay 5, 2008
  35. Linus TorvaldsMay 6, 2008
  36. Linus TorvaldsMay 6, 2008
  37. Theodore TsoMay 6, 2008
  38. Linus TorvaldsMay 6, 2008
  39. Linus TorvaldsMay 6, 2008
  40. Ittay DrorMay 6, 2008
  41. Linus TorvaldsMay 6, 2008
  42. Avery PennarunMay 6, 2008
  43. Shawn O. PearceMay 6, 2008
  44. Avery PennarunMay 6, 2008
  45. Shawn O. PearceMay 6, 2008
  46. Linus TorvaldsMay 6, 2008
  47. Jeff KingMay 8, 2008
  48. Sitaram ChamartyMay 1, 2008
  49. Ittay DrorMay 1, 2008

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.