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:
parent
869a0eb4eb
commit
3c7bab06e1
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue