]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: skip tasks related to fetching objects
authorGlen Choo <chooglen@google.com>
Wed, 19 Jan 2022 00:00:55 +0000 (16:00 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Jan 2022 00:22:57 +0000 (16:22 -0800)
cmd_fetch() does the following with the assumption that objects are
fetched:

* Run gc
* Write commit graphs (if enabled by fetch.writeCommitGraph=true)

However, neither of these tasks makes sense if objects are not fetched
e.g. `git fetch --negotiate-only` never fetches objects.

Speed up cmd_fetch() by bailing out early if we know for certain that
objects will not be fetched. cmd_fetch() can bail out early whenever
objects are not fetched, but for now this only considers
--negotiate-only.

The same optimization does not apply to `git fetch --dry-run` because
that actually fetches objects; the dry run refers to not updating refs.

Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch.c

index eab73d74176938ce3ff672092056bcd7bc8e807a..06e514b07e5c787a9b9eb3edf321a448c1d3c63f 100644 (file)
@@ -2133,6 +2133,17 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
                strvec_clear(&options);
        }
 
+       /*
+        * Skip irrelevant tasks because we know objects were not
+        * fetched.
+        *
+        * NEEDSWORK: as a future optimization, we can return early
+        * whenever objects were not fetched e.g. if we already have all
+        * of them.
+        */
+       if (negotiate_only)
+               goto cleanup;
+
        prepare_repo_settings(the_repository);
        if (fetch_write_commit_graph > 0 ||
            (fetch_write_commit_graph < 0 &&