Skip to content

Commit f61ade4

Browse files
authored
Merge pull request #3 from benpeart/merge-recursive
Fast track bug fix to merge-recursive
2 parents ab82508 + 3f047ee commit f61ade4

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

merge-recursive.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,10 +3043,26 @@ static int merge_content(struct merge_options *o,
30433043
if (mfi.clean &&
30443044
was_tracked_and_matches(o, path, &mfi.oid, mfi.mode) &&
30453045
!df_conflict_remains) {
3046+
int pos;
3047+
struct cache_entry *ce;
3048+
30463049
output(o, 3, _("Skipped %s (merged same as existing)"), path);
30473050
if (add_cacheinfo(o, mfi.mode, &mfi.oid, path,
30483051
0, (!o->call_depth && !is_dirty), 0))
30493052
return -1;
3053+
/*
3054+
* However, add_cacheinfo() will delete the old cache entry
3055+
* and add a new one. We need to copy over any skip_worktree
3056+
* flag to avoid making the file appear as if it were
3057+
* deleted by the user.
3058+
*/
3059+
pos = index_name_pos(&o->orig_index, path, strlen(path));
3060+
ce = o->orig_index.cache[pos];
3061+
if (ce_skip_worktree(ce)) {
3062+
pos = index_name_pos(&the_index, path, strlen(path));
3063+
ce = the_index.cache[pos];
3064+
ce->ce_flags |= CE_SKIP_WORKTREE;
3065+
}
30503066
return mfi.clean;
30513067
}
30523068

t/t3507-cherry-pick-conflict.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,4 +392,17 @@ test_expect_success 'commit --amend -s places the sign-off at the right place' '
392392
test_cmp expect actual
393393
'
394394

395+
test_expect_success 'cherry-pick preserves sparse-checkout' '
396+
pristine_detach initial &&
397+
test_config core.sparseCheckout true &&
398+
test_when_finished "
399+
echo \"/*\" >.git/info/sparse-checkout
400+
git read-tree --reset -u HEAD
401+
rm .git/info/sparse-checkout" &&
402+
echo /unrelated >.git/info/sparse-checkout &&
403+
git read-tree --reset -u HEAD &&
404+
test_must_fail git cherry-pick -Xours picked>actual &&
405+
test_i18ngrep ! "Changes not staged for commit:" actual
406+
'
407+
395408
test_done

0 commit comments

Comments
 (0)