Skip to content

Commit c3d6b70

Browse files
pcloudsgitster
authored andcommitted
fetch: only run 'gc' once when fetching multiple remotes
In multiple remotes mode, git-fetch is launched for n-1 remotes and the last remote is handled by the current process. Each of these processes will in turn run 'gc' at the end. This is not really a problem because even if multiple 'gc --auto' is run at the same time we still handle it correctly. It does show multiple "auto packing in the background" messages though. And we may waste some resources when gc actually runs because we still do some stuff before checking the lock and moving it to background. So let's try to avoid that. We should only need one 'gc' run after all objects and references are added anyway. Add a new option --no-auto-gc that will be used by those n-1 processes. 'gc --auto' will always run on the main fetch process (*). (*) even if we fetch remotes in parallel at some point in future, this should still be fine because we should "join" all those processes before this step. Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Acked-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b697d92 commit c3d6b70

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

Documentation/fetch-options.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ ifndef::git-pull[]
8888
Allow several <repository> and <group> arguments to be
8989
specified. No <refspec>s may be specified.
9090

91+
--[no-]auto-gc::
92+
Run `git gc --auto` at the end to perform garbage collection
93+
if needed. This is enabled by default.
94+
9195
-p::
9296
--prune::
9397
Before fetching, remove any remote-tracking references that no

builtin/fetch.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static int prune_tags = -1; /* unspecified */
4848

4949
static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity, deepen_relative;
5050
static int progress = -1;
51+
static int enable_auto_gc = 1;
5152
static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen;
5253
static int max_children = 1;
5354
static enum transport_family family;
@@ -169,6 +170,8 @@ static struct option builtin_fetch_options[] = {
169170
OPT_STRING_LIST(0, "negotiation-tip", &negotiation_tip, N_("revision"),
170171
N_("report that we have only objects reachable from this object")),
171172
OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
173+
OPT_BOOL(0, "auto-gc", &enable_auto_gc,
174+
N_("run 'gc --auto' after fetching")),
172175
OPT_END()
173176
};
174177

@@ -1424,7 +1427,7 @@ static int fetch_multiple(struct string_list *list)
14241427
return errcode;
14251428
}
14261429

1427-
argv_array_pushl(&argv, "fetch", "--append", NULL);
1430+
argv_array_pushl(&argv, "fetch", "--append", "--no-auto-gc", NULL);
14281431
add_options_to_argv(&argv);
14291432

14301433
for (i = 0; i < list->nr; i++) {
@@ -1674,11 +1677,13 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
16741677

16751678
close_all_packs(the_repository->objects);
16761679

1677-
argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
1678-
if (verbosity < 0)
1679-
argv_array_push(&argv_gc_auto, "--quiet");
1680-
run_command_v_opt(argv_gc_auto.argv, RUN_GIT_CMD);
1681-
argv_array_clear(&argv_gc_auto);
1680+
if (enable_auto_gc) {
1681+
argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
1682+
if (verbosity < 0)
1683+
argv_array_push(&argv_gc_auto, "--quiet");
1684+
run_command_v_opt(argv_gc_auto.argv, RUN_GIT_CMD);
1685+
argv_array_clear(&argv_gc_auto);
1686+
}
16821687

16831688
return result;
16841689
}

t/t5514-fetch-multiple.sh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ test_expect_success 'git fetch --multiple (two remotes)' '
105105
git remote rm origin &&
106106
git remote add one ../one &&
107107
git remote add two ../two &&
108-
git fetch --multiple one two &&
108+
GIT_TRACE=1 git fetch --multiple one two 2>trace &&
109109
git branch -r > output &&
110-
test_cmp ../expect output)
110+
test_cmp ../expect output &&
111+
grep "built-in: git gc" trace >gc &&
112+
test_line_count = 1 gc
113+
)
111114
'
112115

113116
test_expect_success 'git fetch --multiple (bad remote names)' '

0 commit comments

Comments
 (0)