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

Re: `git diff --break-rewrites` does not work (otherwise it should break rewrite into delete and create, for `--find-renames` to work)

From
Jeff King <peff@peff.net>
Date
Sep 11, 2024, 06:48 UTC
Message-ID
<20240911064836.GB1538586@coredump.intra.peff.net>
In-Reply-To
<CANrWfmTz6x0qmTDaTOF_USR+fDcVdwfpUJDhjozb_VzBAnUJsA@mail.gmail.com>
On Tue, Sep 10, 2024 at 11:07:19PM +1200, Han Jiang wrote:
Show 24 quoted lines
> Thank you for filling out a Git bug report!
> Please answer the following questions to help us understand your issue.
> 
> What did you do before the bug happened? (Steps to reproduce your issue)
> 
> cd '/'; cd '/'; rm --force --recursive -- './test_git2'; mkdir "$_"; cd "$_";
> mkdir --parents -- './repo';
> git init './repo'
> echo -e 'a\nb\nc\nd\ne\nf\ng\nh\ni\nj' >'./repo/file1'
> echo -e '0\n1\n2\n3\n4\n5\n6\n7\n8\n9' >'./repo/file2'
> git -C './repo' add './file1' './file2'
> mv './repo/file2' './repo/file3'
> mv './repo/file1' './repo/file2'
> git -C './repo' add --intent-to-add './file3'
> git -C './repo' diff --break-rewrites='50%/50%' --find-renames='50%'
> 
> What did you expect to happen? (Expected behavior)
> 
> `git diff` outputs: file1 rename to file2, file2 rename to file3
> 
> What happened instead? (Actual behavior)
> 
> `git diff` outputs: file1 remove all content, file2 complete rewrite,
> file3 add all content
It's because your toy example is too small. Try:
  seq 400 >repo/file2
instead of the 0-9 input, which will then do what you expect.

There is a hard-coded MINIMUM_BREAK_SIZE limit which requires that one of the files must be at least 400 bytes, presumably to avoid awkward corner cases in the heuristics for very small files. That comes from eeaa460314 ([PATCH] diff: Update -B heuristics., 2005-06-03), so quite long ago. But I'm not sure if any science went into determining it.

Do you have a real (non-toy) case where it should be triggering but isn't? I wonder if we should consider making that hard-coded limit configurable somehow.

-Peff
Previous: Han JiangNext: Han Jiang
Message 2 of 3 in “`git diff --break-rewrites` does not work (otherwise it should break rewrite into delete and create, for `--find-renames` to work)”
  1. Han JiangSep 10, 2024
  2. Jeff KingSep 11, 2024
  3. Han JiangSep 11, 2024

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.