summaryrefslogtreecommitdiff
path: root/merge-recursive.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-08-15 22:08:25 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-08-15 22:08:26 (GMT)
commite4095da40eef81f853bbeedf44d7f344bf682232 (patch)
tree456ce3ad1c5bc26992b02536fbe294f619b12cec /merge-recursive.c
parentd6628c99faf0de4d34c44f815d2aaa7dee38a300 (diff)
parent2b75fb601c05a789988cf0e1b3c1375ee62d3c3e (diff)
downloadgit-e4095da40eef81f853bbeedf44d7f344bf682232.zip
git-e4095da40eef81f853bbeedf44d7f344bf682232.tar.gz
git-e4095da40eef81f853bbeedf44d7f344bf682232.tar.bz2
Merge branch 'en/merge-recursive-skip-fix'
When the sparse checkout feature is in use, "git cherry-pick" and other mergy operations lost the skip_worktree bit when a path that is excluded from checkout requires content level merge, which is resolved as the same as the HEAD version, without materializing the merge result in the working tree, which made the path appear as deleted. This has been corrected by preserving the skip_worktree bit (and not materializing the file in the working tree). * en/merge-recursive-skip-fix: merge-recursive: preserve skip_worktree bit when necessary t3507: add a testcase showing failure with sparse checkout
Diffstat (limited to 'merge-recursive.c')
-rw-r--r--merge-recursive.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/merge-recursive.c b/merge-recursive.c
index 1446e92..bd053c7 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -3070,10 +3070,26 @@ static int merge_content(struct merge_options *o,
if (mfi.clean &&
was_tracked_and_matches(o, path, &mfi.oid, mfi.mode) &&
!df_conflict_remains) {
+ int pos;
+ struct cache_entry *ce;
+
output(o, 3, _("Skipped %s (merged same as existing)"), path);
if (add_cacheinfo(o, mfi.mode, &mfi.oid, path,
0, (!o->call_depth && !is_dirty), 0))
return -1;
+ /*
+ * However, add_cacheinfo() will delete the old cache entry
+ * and add a new one. We need to copy over any skip_worktree
+ * flag to avoid making the file appear as if it were
+ * deleted by the user.
+ */
+ pos = index_name_pos(&o->orig_index, path, strlen(path));
+ ce = o->orig_index.cache[pos];
+ if (ce_skip_worktree(ce)) {
+ pos = index_name_pos(&the_index, path, strlen(path));
+ ce = the_index.cache[pos];
+ ce->ce_flags |= CE_SKIP_WORKTREE;
+ }
return mfi.clean;
}