On Fri, Jan 23, 2015 at 06:04:19AM -0500, Jeff King wrote:
> On Fri, Jan 23, 2015 at 10:29:08AM +0900, Mike Hommey wrote:
> 
> > While fooling around with copy/rename detection, I noticed that it
> > doesn't detect the case where you copy or rename a file on top of
> > another:
> > 
> > $ git init
> > $ (echo foo; echo bar) > foo
> 
> If I replace this with a longer input, like:
> 
>   cp /usr/share/dict/words foo
> 
> > $ git add foo
> > $ git commit -m foo
> > $ echo 0 > bar
> > $ git add bar
> > $ git commit -m bar
> > $ git mv -f foo bar
> > $ git commit -m foobar
> > $ git log --oneline --reverse
> > 7dc2765 foo
> > b0c837d bar
> > 88caeba foobar
> > $ git blame -s -C -C bar
> > 88caebab 1) foo
> > 88caebab 2) bar
> 
> Then the blame shows me the initial "foo" commit. So I think it is
> mainly that your toy example is too small (I think we will do
> exact rename detection whatever the size is, but I expect we are getting
> hung up on the break detection between "0\n" and "foo\nbar\n").

Err, I was afraid my testcase was too small. And that all boils down to
this:

    <num> is optional but it is the lower bound on the number of
    alphanumeric characters that Git must detect as moving/copying
    between files for it to associate those lines with the parent
    commit. And the default value is 40.

> > I can see how this is not trivially representable in e.g. git diff-tree,
> > but shouldn't at least blame try to tell that those lines actually come
> > from 7dc2765?
> 
> diff-tree can show this, too, but you need to turn on "break detection"
> which will notice that "bar" has essentially been rewritten (and then
> consider its sides as candidates for rename detection). For example
> (with the longer input, as above):
> 
>   $ git diff-tree --name-status -M HEAD
>   c6fe146b0c73adcbc4dbc2e58eb83af9007678bc
>   M       bar
>   D       foo
> 
>   $ git diff-tree --name-status -M -B HEAD
>   c6fe146b0c73adcbc4dbc2e58eb83af9007678bc
>   R100    foo     bar
> 
> Presumably if you set the break score low enough, your original example
> would behave the same way, but I couldn't get it to work (I didn't look
> closely, but I imagine it is just so tiny that we hit the internal
> limits on how low you can set the score).o

Oh. Good to know, thanks.

Mike
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to