Files
git/builtin/merge-ours.c
Sam Bostock fb1b786ebf 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>
2026-02-06 11:45:33 -08:00

42 lines
1.0 KiB
C

/*
* Implementation of git-merge-ours.sh as builtin
*
* Copyright (c) 2007 Thomas Harning Jr
* Original:
* Original Copyright (c) 2005 Junio C Hamano
*
* Pretend we resolved the heads, but declare our tree trumps everybody else.
*/
#include "git-compat-util.h"
#include "builtin.h"
#include "config.h"
#include "environment.h"
#include "diff.h"
static const char builtin_merge_ours_usage[] =
"git merge-ours <base>... -- HEAD <remote>...";
int cmd_merge_ours(int argc,
const char **argv,
const char *prefix UNUSED,
struct repository *repo)
{
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
* through.
*/
if (repo_read_index(repo) < 0)
die_errno("read_cache failed");
if (index_differs_from(repo, "HEAD", NULL, 0))
return 2;
return 0;
}