1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-05 11:46:10 +02:00

fetch: add --refetch option

Teach fetch and transports the --refetch option to force a full fetch
without negotiating common commits with the remote. Use when applying a
new partial clone filter to refetch all matching objects.

Signed-off-by: Robert Coup <robert@coup.net.nz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Robert Coup 2022-03-28 14:02:08 +00:00 committed by Junio C Hamano
parent 869a0eb4eb
commit 3c7bab06e1
5 changed files with 34 additions and 1 deletions

View File

@ -163,6 +163,15 @@ endif::git-pull[]
behavior for a remote may be specified with the remote.<name>.tagOpt behavior for a remote may be specified with the remote.<name>.tagOpt
setting. See linkgit:git-config[1]. setting. See linkgit:git-config[1].
ifndef::git-pull[]
--refetch::
Instead of negotiating with the server to avoid transferring commits and
associated objects that are already present locally, this option fetches
all objects as a fresh clone would. Use this to reapply a partial clone
filter from configuration or using `--filter=` when the filter
definition has changed.
endif::git-pull[]
--refmap=<refspec>:: --refmap=<refspec>::
When fetching refs listed on the command line, use the When fetching refs listed on the command line, use the
specified refspec (can be given more than once) to map the specified refspec (can be given more than once) to map the

View File

@ -59,7 +59,7 @@ static int prune_tags = -1; /* unspecified */
static int all, append, dry_run, force, keep, multiple, update_head_ok; static int all, append, dry_run, force, keep, multiple, update_head_ok;
static int write_fetch_head = 1; static int write_fetch_head = 1;
static int verbosity, deepen_relative, set_upstream; static int verbosity, deepen_relative, set_upstream, refetch;
static int progress = -1; static int progress = -1;
static int enable_auto_gc = 1; static int enable_auto_gc = 1;
static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen; static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen;
@ -190,6 +190,9 @@ static struct option builtin_fetch_options[] = {
OPT_SET_INT_F(0, "unshallow", &unshallow, OPT_SET_INT_F(0, "unshallow", &unshallow,
N_("convert to a complete repository"), N_("convert to a complete repository"),
1, PARSE_OPT_NONEG), 1, PARSE_OPT_NONEG),
OPT_SET_INT_F(0, "refetch", &refetch,
N_("re-fetch without negotiating common commits"),
1, PARSE_OPT_NONEG),
{ OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, N_("dir"), { OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, N_("dir"),
N_("prepend this to submodule path output"), PARSE_OPT_HIDDEN }, N_("prepend this to submodule path output"), PARSE_OPT_HIDDEN },
OPT_CALLBACK_F(0, "recurse-submodules-default", OPT_CALLBACK_F(0, "recurse-submodules-default",
@ -1296,6 +1299,14 @@ static int check_exist_and_connected(struct ref *ref_map)
if (deepen) if (deepen)
return -1; return -1;
/*
* Similarly, if we need to refetch, we always want to perform a full
* fetch ignoring existing objects.
*/
if (refetch)
return -1;
/* /*
* check_connected() allows objects to merely be promised, but * check_connected() allows objects to merely be promised, but
* we need all direct targets to exist. * we need all direct targets to exist.
@ -1492,6 +1503,8 @@ static struct transport *prepare_transport(struct remote *remote, int deepen)
set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, "yes"); set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, "yes");
if (update_shallow) if (update_shallow)
set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes"); set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes");
if (refetch)
set_option(transport, TRANS_OPT_REFETCH, "yes");
if (filter_options.choice) { if (filter_options.choice) {
const char *spec = const char *spec =
expand_list_objects_filter_spec(&filter_options); expand_list_objects_filter_spec(&filter_options);

View File

@ -715,6 +715,9 @@ static int fetch_refs(struct transport *transport,
if (data->transport_options.update_shallow) if (data->transport_options.update_shallow)
set_helper_option(transport, "update-shallow", "true"); set_helper_option(transport, "update-shallow", "true");
if (data->transport_options.refetch)
set_helper_option(transport, "refetch", "true");
if (data->transport_options.filter_options.choice) { if (data->transport_options.filter_options.choice) {
const char *spec = expand_list_objects_filter_spec( const char *spec = expand_list_objects_filter_spec(
&data->transport_options.filter_options); &data->transport_options.filter_options);

View File

@ -243,6 +243,9 @@ static int set_git_option(struct git_transport_options *opts,
list_objects_filter_die_if_populated(&opts->filter_options); list_objects_filter_die_if_populated(&opts->filter_options);
parse_list_objects_filter(&opts->filter_options, value); parse_list_objects_filter(&opts->filter_options, value);
return 0; return 0;
} else if (!strcmp(name, TRANS_OPT_REFETCH)) {
opts->refetch = !!value;
return 0;
} else if (!strcmp(name, TRANS_OPT_REJECT_SHALLOW)) { } else if (!strcmp(name, TRANS_OPT_REJECT_SHALLOW)) {
opts->reject_shallow = !!value; opts->reject_shallow = !!value;
return 0; return 0;
@ -377,6 +380,7 @@ static int fetch_refs_via_pack(struct transport *transport,
args.update_shallow = data->options.update_shallow; args.update_shallow = data->options.update_shallow;
args.from_promisor = data->options.from_promisor; args.from_promisor = data->options.from_promisor;
args.filter_options = data->options.filter_options; args.filter_options = data->options.filter_options;
args.refetch = data->options.refetch;
args.stateless_rpc = transport->stateless_rpc; args.stateless_rpc = transport->stateless_rpc;
args.server_options = transport->server_options; args.server_options = transport->server_options;
args.negotiation_tips = data->options.negotiation_tips; args.negotiation_tips = data->options.negotiation_tips;

View File

@ -16,6 +16,7 @@ struct git_transport_options {
unsigned update_shallow : 1; unsigned update_shallow : 1;
unsigned reject_shallow : 1; unsigned reject_shallow : 1;
unsigned deepen_relative : 1; unsigned deepen_relative : 1;
unsigned refetch : 1;
/* see documentation of corresponding flag in fetch-pack.h */ /* see documentation of corresponding flag in fetch-pack.h */
unsigned from_promisor : 1; unsigned from_promisor : 1;
@ -216,6 +217,9 @@ void transport_check_allowed(const char *type);
/* Filter objects for partial clone and fetch */ /* Filter objects for partial clone and fetch */
#define TRANS_OPT_LIST_OBJECTS_FILTER "filter" #define TRANS_OPT_LIST_OBJECTS_FILTER "filter"
/* Refetch all objects without negotiating */
#define TRANS_OPT_REFETCH "refetch"
/* Request atomic (all-or-nothing) updates when pushing */ /* Request atomic (all-or-nothing) updates when pushing */
#define TRANS_OPT_ATOMIC "atomic" #define TRANS_OPT_ATOMIC "atomic"