merge-ours: integrate with sparse-index

The merge-ours built-in opens the index to compare it against HEAD. The machinery used to do this (i.e. run_diff_index()) is capable of working with a sparse index, but the start-up sequence of this command does not take the necessary steps, so we end up expanding the index fully before doing the comparison. In order to convince sparse-index.c:is_sparse_index_allowed() to return true, we need to: - Read basic configuration with git_default_config so that global variables like core_apply_sparse_checkout are populated. merge-ours currently does not read configuration at all. - Set command_requires_full_index to 0. With that, the command can work without expanding the index fully before doing its work. Signed-off-by: Sam Bostock <sam@sambostock.ca> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Sam Bostock committed Feb 6, 2026 at 19:16 UTC fb1b786ebfab18b851ce1fa94d5063daf11f647f
2 files changed +20
builtin/merge-ours.c
+6
@@ -10,6 +10,8 @@
10
11 #include "git-compat-util.h"
12 #include "builtin.h"
13 +#include "config.h"
14 +#include "environment.h"
15 #include "diff.h"
16
17 static const char builtin_merge_ours_usage[] =
@@ -22,6 +24,10 @@ int cmd_merge_ours(int argc,
24 {
25 show_usage_if_asked(argc, argv, builtin_merge_ours_usage);
26
27 + repo_config(repo, git_default_config, NULL);
28 + prepare_repo_settings(repo);
29 + repo->settings.command_requires_full_index = 0;
30 +
31 /*
32 * The contents of the current index becomes the tree we
33 * commit. The index must match HEAD, or this merge cannot go
t/t1092-sparse-checkout-compatibility.sh
+14
@@ -2559,4 +2559,18 @@ test_expect_success 'cat-file --batch' '
2559 ensure_expanded cat-file --batch <in
2560 '
2561
2562 +test_expect_success 'merge -s ours' '
2563 + init_repos &&
2564 +
2565 + test_all_match git rev-parse HEAD^{tree} &&
2566 + test_all_match git merge -s ours merge-right &&
2567 + test_all_match git rev-parse HEAD^{tree} &&
2568 + test_all_match git rev-parse HEAD^2
2569 +'
2570 +
2571 +test_expect_success 'sparse-index is not expanded: merge-ours' '
2572 + init_repos &&
2573 + ensure_not_expanded merge -s ours merge-right
2574 +'
2575 +
2576 test_done