On Jonathan Nieder wrote:
David D. Kilzer wrote:
quoted
With diff.renames = copies, a rebase with a file move will fail with
the following error:
fatal: mode change for <file>, which is not in current HEAD
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Patch failed at 0001.
I would think that the following works fine:
git init test-repo &&
cd test-repo &&
echo hello >greeting.txt &&
git add greeting.txt &&
git commit -m base &&
git checkout -b move &&
git mv greeting.txt moved.txt &&
git commit -m move &&
git checkout master &&
echo hi >greeting.txt &&
git add greeting.txt &&
git commit -m change &&
git checkout move &&
echo '[diff] renames = copies' >>.git/config &&
git rebase master
What am I doing wrong?
Given the following tree:
B' topic
/
A---B master
A: New file "F1" is committed.
B: New file "F2" is committed.
B': New file "F2" is committed (identical in content to "F2" on B), and "F1" is
renamed to "F3".
When the topic branch is rebased onto master with diff.renames=copies, git fails
when attempting to build a fake ancestor for F1. The key to reproducing the bug
is to have an identical new file added on both B and B'.
My original patch in <http://marc.info/?l=git&m=122635667614099&w=2> addressed
this in builtin-apply.c, but Junio didn't like this approach as noted in
<http://marc.info/?l=git&m=122636097120953&w=2>.
Patch does not apply to master or maint, due to conflict with
v1.7.1-rc0~37^2~5 (rebase: support automatic notes copying,
2010-03-12). One sneaky way to avoid this kind of thing would be to
insert new tests at some logical point in the middle of a test script.
Sorry about that--I forgot to rebase it to maint before sending it.
Test nitpicks:
Thanks! I'll make the requested changes in the next patch.
This wants to notice that Y was already added so the top patch can be
simplified to include only a rename.
Actually, this is the key to reproducing the bug!
Can you explain why this test will fail without your patch?
Here is a stand-alone script that reproduces the bug:
git init test-repo &&
cd test-repo &&
echo hello > F1 &&
git add F1 &&
git commit -m "A" &&
git checkout -b topic &&
echo hi > F2 &&
git add F2 &&
git mv F1 F3 &&
git commit -m "B'" &&
git checkout master &&
echo hi > F2 &&
git add F2 &&
git commit -m "B" &&
git checkout topic &&
git config diff.renames copies &&
GIT_TRACE=1 git rebase master
Note that the test case in my patch depended on "F1" (which was "A") being
committed by an earlier test.
Dave