]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: after refetch, encourage auto gc repacking
authorRobert Coup <robert@coup.net.nz>
Mon, 28 Mar 2022 14:02:10 +0000 (14:02 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Mar 2022 17:25:53 +0000 (10:25 -0700)
After invoking `fetch --refetch`, the object db will likely contain many
duplicate objects. If auto-maintenance is enabled, invoke it with
appropriate settings to encourage repacking/consolidation.

* gc.autoPackLimit: unless this is set to 0 (disabled), override the
  value to 1 to force pack consolidation.
* maintenance.incremental-repack.auto: unless this is set to 0, override
  the value to -1 to force incremental repacking.

Signed-off-by: Robert Coup <robert@coup.net.nz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/fetch-options.txt
builtin/fetch.c
t/t5616-partial-clone.sh

index 21a247abfa4f67699ce04face235856450e6a516..49ae48dca32fff608bd2992d2959b6706a859622 100644 (file)
@@ -169,7 +169,8 @@ ifndef::git-pull[]
        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.
+       definition has changed. Automatic post-fetch maintenance will perform
+       object database pack consolidation to remove any duplicate objects.
 endif::git-pull[]
 
 --refmap=<refspec>::
index aa53ada58ac68e8b74ade93ccd427e5eb6ee119b..a47b696b89d5641386c02087ea2abdec2d427a27 100644 (file)
@@ -2226,8 +2226,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);
index 87ebf4b0b1c8a818ca78eca02be8b6f4820f2f64..4a3778d04a82df6322048e34864578860b96f859 100755 (executable)
@@ -216,6 +216,35 @@ test_expect_success 'fetch --refetch works with a shallow clone' '
        test_line_count = 6 observed
 '
 
+test_expect_success 'fetch --refetch triggers repacking' '
+       GIT_TRACE2_CONFIG_PARAMS=gc.autoPackLimit,maintenance.incremental-repack.auto &&
+       export GIT_TRACE2_CONFIG_PARAMS &&
+
+       GIT_TRACE2_EVENT="$PWD/trace1.event" \
+       git -C pc1 fetch --refetch origin &&
+       test_subcommand git maintenance run --auto --no-quiet <trace1.event &&
+       grep \"param\":\"gc.autopacklimit\",\"value\":\"1\" trace1.event &&
+       grep \"param\":\"maintenance.incremental-repack.auto\",\"value\":\"-1\" trace1.event &&
+
+       GIT_TRACE2_EVENT="$PWD/trace2.event" \
+       git -c protocol.version=0 \
+               -c gc.autoPackLimit=0 \
+               -c maintenance.incremental-repack.auto=1234 \
+               -C pc1 fetch --refetch origin &&
+       test_subcommand git maintenance run --auto --no-quiet <trace2.event &&
+       grep \"param\":\"gc.autopacklimit\",\"value\":\"0\" trace2.event &&
+       grep \"param\":\"maintenance.incremental-repack.auto\",\"value\":\"-1\" trace2.event &&
+
+       GIT_TRACE2_EVENT="$PWD/trace3.event" \
+       git -c protocol.version=0 \
+               -c gc.autoPackLimit=1234 \
+               -c maintenance.incremental-repack.auto=0 \
+               -C pc1 fetch --refetch origin &&
+       test_subcommand git maintenance run --auto --no-quiet <trace3.event &&
+       grep \"param\":\"gc.autopacklimit\",\"value\":\"1\" trace3.event &&
+       grep \"param\":\"maintenance.incremental-repack.auto\",\"value\":\"0\" trace3.event
+'
+
 test_expect_success 'partial clone with transfer.fsckobjects=1 works with submodules' '
        test_create_repo submodule &&
        test_commit -C submodule mycommit &&