Mikhail Filippov <mikhail@xxxxxxxxxxx> writes: > --- You'd need a lot more explanation on why this is needed (i.e. without it what behaviour you would get, and why that behaviour is wrong). > merge-recursive.c | 9 +++++--- > t/t6042-merge-rename-corner-cases.sh | 42 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 48 insertions(+), 3 deletions(-) > > diff --git a/merge-recursive.c b/merge-recursive.c > index e349126..25dc701 100644 > --- a/merge-recursive.c > +++ b/merge-recursive.c > @@ -1724,9 +1724,12 @@ static int merge_content(struct merge_options *o, > */ > path_renamed_outside_HEAD = !path2 || !strcmp(path, path2); > if (!path_renamed_outside_HEAD) { > - add_cacheinfo(o, mfi.mode, &mfi.oid, path, > - 0, (!o->call_depth), 0); > - return mfi.clean; > + struct stat st; > + if (lstat(path, &st) == 0) { > + add_cacheinfo(o, mfi.mode, &mfi.oid, path, > + 0, (!o->call_depth), 0); > + return mfi.clean; > + } I cannot guess what you are trying to achieve without explanation in the proposed log message, but I can say that this unconditional checking of a working tree file cannot be correct (there may or may not be other things that are wrong with this change, which cannot be judged without more information). Imagine your o->call_depth is not zero, i.e. we are making a virtual common ancestor with this merge, in which case any of the three trees involved may have nothing to do with the current working tree files. > +test_expect_success 'move file/sparse-checkout/merge should not delete moved file' ' > + git rm -rf . && > + git clean -fdqx && > + rm -rf .git && > + git init && Yuck. This is inherited from existing tests but I think they need to be cleaned up. It is not your fault, and it is not in the scope of this change. > + git status >output && > + cp output /tmp/a && Huh? > + test_i18ngrep "nothing to commit" output > +' > + > test_done