git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 0/8] builtin/maintenance: use "geometric" strategy by default

From
Patrick Steinhardt <ps@pks.im>
Date
Feb 24, 2026, 08:45 UTC
Message-ID
<20260224-b4-pks-maintenance-default-geometric-strategy-v2-0-8657338c6fa1@pks.im>
In-Reply-To
<20260220-b4-pks-maintenance-default-geometric-strategy-v1-0-faeb321ad13b@pks.im>
Hi,

this series converts our default strategy used by git-maintenance(1) from "gc" to "geometric". The aim of this is twofold:

  - It completes the conversion to a more flexible infrastructure for
    repository maintenance. git-maintenance(1) is structured around
    tasks that can be toggled on/off as needed, and this is a lot easier
    to extend going forward.
  - We start to use a more efficient repacking strategy by default,
    which should especially help large repositories out there.

Out of these two, I think that the first point is actually the more important one.

Unfortunately, a lot of our tests are racy or will fail with the new strategy. This is mostly because the new strategy may decide to optimize data structures in cases where the old strategy didn't, and because the tasks we perform might be different. The majority of this patch series thus adapts our tests accordingly. The actual change is a one-line change in the final commit.

I was a bit torn initially whether or not I want to make the geometric strategy the default right away, or whether we might first want to use "feature.experimental" as an additional step. I'm quite happy to adapt the series accordingly, but for the initial version I thought it might invite more discussions if I pick the nuclear option :)

Of course, no matter how we do this, it is still possible to revert back to the old strategy by setting "maintenance.strategy=gc".

Changes in v2:
  - Document the updated default strategy.
  - Clarify how this interacts with Scalar.
  - Explain the current landscape of strategies a bit better.
  - Leave some breadcrumbs in the tests.
  - Link to v1: https://lore.kernel.org/r/20260220-b4-pks-maintenance-default-geometric-strategy-v1-0-faeb321ad13b@pks.im
Thanks!
Patrick
---
Patrick Steinhardt (8):
      t: fix races caused by background maintenance
      t: disable maintenance where we verify object database structure
      t34xx: don't expire reflogs where it matters
      t5400: explicitly use "gc" strategy
      t5510: explicitly use "gc" strategy
      t6500: explicitly use "gc" strategy
      t7900: prepare for switch of the default strategy
      builtin/maintenance: use "geometric" strategy by default
 Documentation/config/maintenance.adoc   | 6 +++---
 builtin/gc.c                            | 2 +-
 run-command.c                           | 2 +-
 t/t0081-find-pack.sh                    | 1 +
 t/t3404-rebase-interactive.sh           | 6 ++++++
 t/t3406-rebase-message.sh               | 6 ++++++
 t/t3431-rebase-fork-point.sh            | 6 ++++++
 t/t3432-rebase-fast-forward.sh          | 6 ++++++
 t/t5316-pack-delta-depth.sh             | 1 +
 t/t5319-multi-pack-index.sh             | 1 +
 t/t5326-multi-pack-bitmaps.sh           | 3 ++-
 t/t5327-multi-pack-bitmaps-rev.sh       | 3 ++-
 t/t5331-pack-objects-stdin.sh           | 2 ++
 t/t5332-multi-pack-reuse.sh             | 1 +
 t/t5334-incremental-multi-pack-index.sh | 1 +
 t/t5400-send-pack.sh                    | 1 +
 t/t5500-fetch-pack.sh                   | 3 ++-
 t/t5510-fetch.sh                        | 1 +
 t/t5616-partial-clone.sh                | 7 ++++---
 t/t6500-gc.sh                           | 1 +
 t/t7700-repack.sh                       | 3 +++
 t/t7900-maintenance.sh                  | 9 ++++++++-
 t/test-lib.sh                           | 4 ++++
 23 files changed, 64 insertions(+), 12 deletions(-)
Range-diff versus v1:
1:  c5fadf42d0 ! 1:  9efc6d0a22 t: fix races caused by background maintenance
    @@ Commit message
         background maintenance all over the place.
     
         Disabling maintenance outright in our test suite is not really an
    -    option, as it would result in significantly divergence from the "real
    +    option, as it would result in significant divergence from the "real
         world" and reduce our test coverage. But we've got an alternative up our
         sleeves: we can ensure that garbage collection runs synchronously by
         overriding the "maintenance.autoDetach" configuration.
    @@ Commit message
         slightly, but that may just as well be noise.
     
         Introduce a new `GIT_TEST_MAINT_AUTO_DETACH` environment variable that
    -    allows us to override the auto-detach behaviour and set that varibale in
    +    allows us to override the auto-detach behaviour and set that variable in
         our tests.
     
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
    @@ t/t5616-partial-clone.sh: test_expect_success 'fetch --refetch triggers repackin
     
      ## t/t7900-maintenance.sh ##
     @@ t/t7900-maintenance.sh: test_description='git maintenance builtin'
    - 
      GIT_TEST_COMMIT_GRAPH=0
      GIT_TEST_MULTI_PACK_INDEX=0
    -+sane_unset GIT_TEST_MAINT_AUTO_DETACH
      
    ++# Ensure that auto-maintenance detaches as usual.
    ++sane_unset GIT_TEST_MAINT_AUTO_DETACH
    ++
      test_lazy_prereq XMLLINT '
      	xmllint --version
    + '
     
      ## t/test-lib.sh ##
     @@ t/test-lib.sh: test_lazy_prereq COMPAT_HASH '
2:  805417a4a7 = 2:  f80bde1353 t: disable maintenance where we verify object database structure
3:  8a579a768d ! 3:  7087a68815 t34xx: don't expire reflogs where it matters
    @@ t/t3404-rebase-interactive.sh: Initial setup:
      . "$TEST_DIRECTORY"/lib-rebase.sh
      
      test_expect_success 'setup' '
    ++	# Commit dates are hardcoded to 2005, and the reflog entries will have
    ++	# a matching timestamp. Maintenance may thus immediately expire
    ++	# reflogs if it was running.
     +	git config set gc.reflogExpire never &&
     +	git config set gc.reflogExpireUnreachable never &&
    ++
      	git switch -C primary &&
      	test_commit A file1 &&
      	test_commit B file1 &&
    @@ t/t3406-rebase-message.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
      . ./test-lib.sh
      
      test_expect_success 'setup' '
    ++	# Commit dates are hardcoded to 2005, and the reflog entries will have
    ++	# a matching timestamp. Maintenance may thus immediately expire
    ++	# reflogs if it was running.
     +	git config set gc.reflogExpire never &&
     +	git config set gc.reflogExpireUnreachable never &&
     +
    @@ t/t3431-rebase-fork-point.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
      # C was formerly part of main but main was rewound to remove C
      #
      test_expect_success setup '
    ++	# Commit dates are hardcoded to 2005, and the reflog entries will have
    ++	# a matching timestamp. Maintenance may thus immediately expire
    ++	# reflogs if it was running.
     +	git config set gc.reflogExpire never &&
     +	git config set gc.reflogExpireUnreachable never &&
    ++
      	test_commit A &&
      	test_commit B &&
      	test_commit C &&
    @@ t/t3432-rebase-fast-forward.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
      . ./test-lib.sh
      
      test_expect_success setup '
    ++	# Commit dates are hardcoded to 2005, and the reflog entries will have
    ++	# a matching timestamp. Maintenance may thus immediately expire
    ++	# reflogs if it was running.
     +	git config set gc.reflogExpire never &&
     +	git config set gc.reflogExpireUnreachable never &&
    ++
      	test_commit A &&
      	test_commit B &&
      	test_commit C &&
4:  283143c1d8 = 4:  d230055b22 t5400: explicitly use "gc" strategy
5:  410dc16eb0 = 5:  dba219391f t5510: explicitly use "gc" strategy
6:  c4c8c5a7e4 = 6:  61bc1add2a t6500: explicitly use "gc" strategy
7:  93893cfee3 = 7:  b89505178d t7900: prepare for switch of the default strategy
8:  9e7aa390a5 < -:  ---------- builtin/maintenance: use "geometric" strategy by default
-:  ---------- > 8:  647d46a239 builtin/maintenance: use "geometric" strategy by default

--- base-commit: 73fd77805fc6406f31c36212846d9e2541d19321 change-id: 20260218-b4-pks-maintenance-default-geometric-strategy-17fcedf92461

Previous: Derrick StoleeNext: Patrick Steinhardt
Message 26 of 38 in “builtin/maintenance: use "geometric" strategy by default”
  1. 0/8 builtin/maintenance: use "geometric" strategy by defaultPatrick Steinhardt, Feb 20, 2026
  2. 1/8 t: fix races caused by background maintenancePatrick Steinhardt, Feb 20, 2026
  3. Justin ToblerFeb 23, 2026
  4. Stefan HallerAug 10, 2026
  5. Patrick SteinhardtAug 10, 2026
  6. Stefan HallerAug 10, 2026
  7. Patrick SteinhardtAug 10, 2026
  8. Stefan HallerAug 10, 2026
  9. Patrick SteinhardtAug 10, 2026
  10. Stefan HallerAug 10, 2026
  11. 2/8 t: disable maintenance where we verify object database structurePatrick Steinhardt, Feb 20, 2026
  12. Justin ToblerFeb 23, 2026
  13. 3/8 t34xx: don't expire reflogs where it mattersPatrick Steinhardt, Feb 20, 2026
  14. Derrick StoleeFeb 23, 2026
  15. Justin ToblerFeb 23, 2026
  16. 4/8 t5400: explicitly use "gc" strategyPatrick Steinhardt, Feb 20, 2026
  17. 5/8 t5510: explicitly use "gc" strategyPatrick Steinhardt, Feb 20, 2026
  18. 6/8 t6500: explicitly use "gc" strategyPatrick Steinhardt, Feb 20, 2026
  19. 7/8 t7900: prepare for switch of the default strategyPatrick Steinhardt, Feb 20, 2026
  20. 8/8 builtin/maintenance: use "geometric" strategy by defaultPatrick Steinhardt, Feb 20, 2026
  21. Derrick StoleeFeb 23, 2026
  22. Patrick SteinhardtFeb 23, 2026
  23. Justin ToblerFeb 23, 2026
  24. Patrick SteinhardtFeb 24, 2026
  25. Derrick StoleeFeb 23, 2026
  26. 0/8 builtin/maintenance: use "geometric" strategy by defaultPatrick Steinhardt, Feb 24, 2026
  27. 1/8 t: fix races caused by background maintenancePatrick Steinhardt, Feb 24, 2026
  28. 2/8 t: disable maintenance where we verify object database structurePatrick Steinhardt, Feb 24, 2026
  29. 3/8 t34xx: don't expire reflogs where it mattersPatrick Steinhardt, Feb 24, 2026
  30. 4/8 t5400: explicitly use "gc" strategyPatrick Steinhardt, Feb 24, 2026
  31. 5/8 t5510: explicitly use "gc" strategyPatrick Steinhardt, Feb 24, 2026
  32. 6/8 t6500: explicitly use "gc" strategyPatrick Steinhardt, Feb 24, 2026
  33. Toon ClaesFeb 25, 2026
  34. 7/8 t7900: prepare for switch of the default strategyPatrick Steinhardt, Feb 24, 2026
  35. 8/8 builtin/maintenance: use "geometric" strategy by defaultPatrick Steinhardt, Feb 24, 2026
  36. Derrick StoleeFeb 24, 2026
  37. Toon ClaesFeb 25, 2026
  38. Justin ToblerFeb 24, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.