diff options
author | David Turner <dturner@twopensource.com> | 2014-05-01 20:21:09 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-05-07 13:53:10 -0700 |
commit | ae352c7f37ef2098e03ee86bc7fd75b210b17683 (patch) | |
tree | daec7c4bdaadb3f2f82a3cdfaa5189e6f5142788 /merge-recursive.c | |
parent | 0bc85abb7aa9b24b093253018801a0fb43d01122 (diff) | |
download | git-ae352c7f37ef2098e03ee86bc7fd75b210b17683.tar.gz git-ae352c7f37ef2098e03ee86bc7fd75b210b17683.tar.xz |
merge-recursive.c: fix case-changing merge bug
On a case-insensitive filesystem, when merging, a file would be
wrongly deleted from the working tree if an incoming commit had
renamed it changing only its case. When merging a rename, the file
with the old name would be deleted -- but since the filesystem
considers the old name to be the same as the new name, the new
file would in fact be deleted.
We avoid this by not deleting files that have a case-clone in the
index at stage 0.
Signed-off-by: David Turner <dturner@twitter.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-recursive.c')
-rw-r--r-- | merge-recursive.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/merge-recursive.c b/merge-recursive.c index 417709294..cab16fafb 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -589,6 +589,12 @@ static int remove_file(struct merge_options *o, int clean, return -1; } if (update_working_directory) { + if (ignore_case) { + struct cache_entry *ce; + ce = cache_file_exists(path, strlen(path), ignore_case); + if (ce && ce_stage(ce) == 0) + return 0; + } if (remove_path(path)) return -1; } |