Merge branch 'rc/fetch-refetch'
"git fetch --refetch" learned to fetch everything without telling the other side what we already have, which is useful when you cannot trust what you have in the local object store. * rc/fetch-refetch: docs: mention --refetch fetch option fetch: after refetch, encourage auto gc repacking t5615-partial-clone: add test for fetch --refetch fetch: add --refetch option builtin/fetch-pack: add --refetch option fetch-pack: add refetch fetch-negotiator: add specific noop initializer
This commit is contained in:
@ -59,7 +59,7 @@ static int prune_tags = -1; /* unspecified */
|
||||
|
||||
static int all, append, dry_run, force, keep, multiple, update_head_ok;
|
||||
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 enable_auto_gc = 1;
|
||||
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,
|
||||
N_("convert to a complete repository"),
|
||||
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"),
|
||||
N_("prepend this to submodule path output"), PARSE_OPT_HIDDEN },
|
||||
OPT_CALLBACK_F(0, "recurse-submodules-default",
|
||||
@ -1304,6 +1307,14 @@ static int check_exist_and_connected(struct ref *ref_map)
|
||||
if (deepen)
|
||||
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
|
||||
* we need all direct targets to exist.
|
||||
@ -1517,6 +1528,8 @@ static struct transport *prepare_transport(struct remote *remote, int deepen)
|
||||
set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, "yes");
|
||||
if (update_shallow)
|
||||
set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes");
|
||||
if (refetch)
|
||||
set_option(transport, TRANS_OPT_REFETCH, "yes");
|
||||
if (filter_options.choice) {
|
||||
const char *spec =
|
||||
expand_list_objects_filter_spec(&filter_options);
|
||||
@ -2293,8 +2306,25 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (enable_auto_gc)
|
||||
if (enable_auto_gc) {
|
||||
if (refetch) {
|
||||
/*
|
||||
* Hint auto-maintenance strongly to encourage repacking,
|
||||
* but respect config settings disabling it.
|
||||
*/
|
||||
int opt_val;
|
||||
if (git_config_get_int("gc.autopacklimit", &opt_val))
|
||||
opt_val = -1;
|
||||
if (opt_val != 0)
|
||||
git_config_push_parameter("gc.autoPackLimit=1");
|
||||
|
||||
if (git_config_get_int("maintenance.incremental-repack.auto", &opt_val))
|
||||
opt_val = -1;
|
||||
if (opt_val != 0)
|
||||
git_config_push_parameter("maintenance.incremental-repack.auto=-1");
|
||||
}
|
||||
run_auto_maintenance(verbosity < 0);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
string_list_clear(&list, 0);
|
||||
|
Reference in New Issue
Block a user