[PATCH v2 2/2] merge-ours: integrate with sparse-index
- From
Sam Bostock via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Feb 6, 2026, 19:16 UTC
- Message-ID
- <55d39ff778b7156d1a1abba4ccc3ea41ae680d2f.1770405383.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2189.v2.git.git.1770405383.gitgitgadget@gmail.com>
From: Sam Bostock <sam@sambostock.ca>
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> --- builtin/merge-ours.c | 6 ++++++ t/t1092-sparse-checkout-compatibility.sh | 14 ++++++++++++++ 2 files changed, 20 insertions(+)
diff --git a/builtin/merge-ours.c b/builtin/merge-ours.c index 2312e58ab3..405b2989f7 100644 --- a/builtin/merge-ours.c +++ b/builtin/merge-ours.c @@ -10,6 +10,8 @@ #include "git-compat-util.h" #include "builtin.h" +#include "config.h" +#include "environment.h" #include "diff.h" static const char builtin_merge_ours_usage[] = @@ -22,6 +24,10 @@ int cmd_merge_ours(int argc, { show_usage_if_asked(argc, argv, builtin_merge_ours_usage); + repo_config(repo, git_default_config, NULL); + prepare_repo_settings(repo); + repo->settings.command_requires_full_index = 0; + /* * The contents of the current index becomes the tree we * commit. The index must match HEAD, or this merge cannot go diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh index b0f691c151..d98cb4ac11 100755 --- a/t/t1092-sparse-checkout-compatibility.sh +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -2559,4 +2559,18 @@ test_expect_success 'cat-file --batch' ' ensure_expanded cat-file --batch <in ' +test_expect_success 'merge -s ours' ' + init_repos && + + test_all_match git rev-parse HEAD^{tree} && + test_all_match git merge -s ours merge-right && + test_all_match git rev-parse HEAD^{tree} && + test_all_match git rev-parse HEAD^2 +' + +test_expect_success 'sparse-index is not expanded: merge-ours' ' + init_repos && + ensure_not_expanded merge -s ours merge-right +' + test_done
-- gitgitgadget