]> git.ipfire.org Git - thirdparty/git.git/commitdiff
maintenance: use 'git fetch --prefetch'
authorDerrick Stolee <dstolee@microsoft.com>
Fri, 16 Apr 2021 12:49:58 +0000 (12:49 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 Apr 2021 20:36:55 +0000 (13:36 -0700)
The 'prefetch' maintenance task previously forced the following refspec
for each remote:

+refs/heads/*:refs/prefetch/<remote>/*

If a user has specified a more strict refspec for the remote, then this
prefetch task downloads more objects than necessary.

The previous change introduced the '--prefetch' option to 'git fetch'
which manipulates the remote's refspec to place all resulting refs into
refs/prefetch/, with further partitioning based on the destinations of
those refspecs.

Update the documentation to be more generic about the destination refs.
Do not mention custom refspecs explicitly, as that does not need to be
highlighted in this documentation. The important part of placing refs in
refs/prefetch/ remains.

Reported-by: Tom Saeger <tom.saeger@oracle.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-maintenance.txt
builtin/gc.c
t/t7900-maintenance.sh

index 80ddd33ceba0dd5f47319ea8355fec7d35a74bef..1e738ad398320a70219b0a664dabbdf9a8103578 100644 (file)
@@ -92,10 +92,8 @@ commit-graph::
 prefetch::
        The `prefetch` task updates the object directory with the latest
        objects from all registered remotes. For each remote, a `git fetch`
-       command is run. The refmap is custom to avoid updating local or remote
-       branches (those in `refs/heads` or `refs/remotes`). Instead, the
-       remote refs are stored in `refs/prefetch/<remote>/`. Also, tags are
-       not updated.
+       command is run. The configured refspec is modified to place all
+       requested refs within `refs/prefetch/`. Also, tags are not updated.
 +
 This is done to avoid disrupting the remote-tracking branches. The end users
 expect these refs to stay unmoved unless they initiate a fetch.  With prefetch
index fa8128de9ae1fc4196dacbbc7b773444c549db64..9d35f7da50d8d736b3da566c9869c62675554c3b 100644 (file)
@@ -879,15 +879,14 @@ static int fetch_remote(struct remote *remote, void *cbdata)
        struct child_process child = CHILD_PROCESS_INIT;
 
        child.git_cmd = 1;
-       strvec_pushl(&child.args, "fetch", remote->name, "--prune", "--no-tags",
+       strvec_pushl(&child.args, "fetch", remote->name,
+                    "--prefetch", "--prune", "--no-tags",
                     "--no-write-fetch-head", "--recurse-submodules=no",
-                    "--refmap=", NULL);
+                    NULL);
 
        if (opts->quiet)
                strvec_push(&child.args, "--quiet");
 
-       strvec_pushf(&child.args, "+refs/heads/*:refs/prefetch/%s/*", remote->name);
-
        return !!run_command(&child);
 }
 
index 2412d8c5c006992f3b895debfa0b6cfcf55d3c9b..eadb800c08ccb6027235e1a069d0a70f707f58ac 100755 (executable)
@@ -141,15 +141,15 @@ test_expect_success 'prefetch multiple remotes' '
        test_commit -C clone1 one &&
        test_commit -C clone2 two &&
        GIT_TRACE2_EVENT="$(pwd)/run-prefetch.txt" git maintenance run --task=prefetch 2>/dev/null &&
-       fetchargs="--prune --no-tags --no-write-fetch-head --recurse-submodules=no --refmap= --quiet" &&
-       test_subcommand git fetch remote1 $fetchargs +refs/heads/\\*:refs/prefetch/remote1/\\* <run-prefetch.txt &&
-       test_subcommand git fetch remote2 $fetchargs +refs/heads/\\*:refs/prefetch/remote2/\\* <run-prefetch.txt &&
+       fetchargs="--prefetch --prune --no-tags --no-write-fetch-head --recurse-submodules=no --quiet" &&
+       test_subcommand git fetch remote1 $fetchargs <run-prefetch.txt &&
+       test_subcommand git fetch remote2 $fetchargs <run-prefetch.txt &&
        test_path_is_missing .git/refs/remotes &&
-       git log prefetch/remote1/one &&
-       git log prefetch/remote2/two &&
+       git log prefetch/remotes/remote1/one &&
+       git log prefetch/remotes/remote2/two &&
        git fetch --all &&
-       test_cmp_rev refs/remotes/remote1/one refs/prefetch/remote1/one &&
-       test_cmp_rev refs/remotes/remote2/two refs/prefetch/remote2/two &&
+       test_cmp_rev refs/remotes/remote1/one refs/prefetch/remotes/remote1/one &&
+       test_cmp_rev refs/remotes/remote2/two refs/prefetch/remotes/remote2/two &&
 
        test_cmp_config refs/prefetch/ log.excludedecoration &&
        git log --oneline --decorate --all >log &&