]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/gc: move worktree and rerere tasks before object optimizations
authorPatrick Steinhardt <ps@pks.im>
Mon, 13 Jul 2026 05:52:06 +0000 (07:52 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 13 Jul 2026 15:13:16 +0000 (08:13 -0700)
In subsequent patches we'll consolidate all tasks that relate to
maintenance of the object database and move it into the "files" backend.
The relevant code is somewhat scattered though, as several other tasks
are interspersed between.

Refactor the code so that all object database optimizations are grouped
together, which requires us to move worktree pruning and rerere garbage
collection around. In theory, rearranging this code can have an effect
on the object database optimizations:

  - Rerere entries really shouldn't impact garbage collection at all, as
    these entries are not stored in the object database.

  - The index and HEAD reference of pruned worktrees may reference
    objects that become unreachable.

That being said, the impact should be overall rather negligible. If the
user was asking us to prune objects with immediate expiration time then
we might now prune objects that were previously still kept alive by the
worktree. But besides being a very specific edge case, it's arguably not
even the wrong thing to also prune any potentially-unreachable objects
immediately.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/gc.c

index 77d0a5c9484375823e38c87deb225760d03d4840..8f568003eef52f1b2c5d4cecd073e27df40af9df 100644 (file)
@@ -1011,6 +1011,13 @@ int cmd_gc(int argc,
        if (opts.detach <= 0 && !skip_foreground_tasks)
                gc_foreground_tasks(&opts, &cfg);
 
+       if (cfg.prune_worktrees_expire &&
+           maintenance_task_worktree_prune(&opts, &cfg))
+               die(FAILED_RUN, "worktree");
+
+       if (maintenance_task_rerere_gc(&opts, &cfg))
+               die(FAILED_RUN, "rerere");
+
        if (!the_repository->repository_format_precious_objects) {
                struct child_process repack_cmd = CHILD_PROCESS_INIT;
 
@@ -1038,13 +1045,6 @@ int cmd_gc(int argc,
                }
        }
 
-       if (cfg.prune_worktrees_expire &&
-           maintenance_task_worktree_prune(&opts, &cfg))
-               die(FAILED_RUN, "worktree");
-
-       if (maintenance_task_rerere_gc(&opts, &cfg))
-               die(FAILED_RUN, "rerere");
-
        report_garbage = report_pack_garbage;
        odb_reprepare(the_repository->objects);
        if (pack_garbage.nr > 0) {