aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Bostock <sam@sambostock.ca>2026-02-06 19:16:23 +0000
committerJunio C Hamano <gitster@pobox.com>2026-02-06 11:45:33 -0800
commitfb1b786ebfab18b851ce1fa94d5063daf11f647f (patch)
treedeec8e2810e3a06d9f7e18ff011d7a2cd48d1fb9
parentba447e9cec47ca5b1cc8cfeae8ca90bc962c54fa (diff)
downloadgit-fb1b786ebfab18b851ce1fa94d5063daf11f647f.tar.xz
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>
-rw-r--r--builtin/merge-ours.c6
-rwxr-xr-xt/t1092-sparse-checkout-compatibility.sh14
2 files changed, 20 insertions, 0 deletions
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