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

[GSoC][PATCH v3 0/9] Add refs optimize subcommand

From
Meet Soni <meetsoni3017@gmail.com>
Date
Sep 18, 2025, 05:46 UTC
Message-ID
<20250918054704.544254-1-meetsoni3017@gmail.com>
In-Reply-To
<20250906075147.1076656-1-meetsoni3017@gmail.com>
Hi everyone,

This series introduces `git refs optimize` as a modern replacement for `git pack-refs`, continuing the effort to consolidate commands under the `git refs` namespace.

Changes in v3:
- Reworked the entire series from scratch to implement the
  architectural feedback provided by Junio in the v2 review.
- Instead of a simple UI alias, this version introduces a generic,
  backend-agnostic `refs_optimize()` API.
- Added implementations for both the 'files' backend (packing) and
  the 'reftable' backend (compaction).
Meet Soni (9):
  refs: add a generic 'optimize' API
  files-backend: implement 'optimize' action
  reftable-backend: implement 'optimize' action
  builtin/pack-refs: convert to use the generic refs_optimize() API
  builtin/pack-refs: factor out core logic into a shared library
  doc: pack-refs: factor out common options
  builtin/refs: add optimize subcommand
  t0601: refactor tests to be shareable
  t: add test for git refs optimize subcommand
 Documentation/git-pack-refs.adoc     |  53 +---
 Documentation/git-refs.adoc          |  10 +
 Documentation/pack-refs-options.adoc |  52 ++++
 Makefile                             |   1 +
 builtin/pack-refs.c                  |  54 +---
 builtin/refs.c                       |  17 ++
 meson.build                          |   1 +
 pack-refs.c                          |  56 ++++
 pack-refs.h                          |  23 ++
 refs.c                               |   7 +
 refs.h                               |   6 +
 refs/files-backend.c                 |  10 +
 refs/refs-internal.h                 |   3 +
 refs/reftable-backend.c              |   7 +
 t/meson.build                        |   3 +-
 t/pack-refs-tests.sh                 | 431 +++++++++++++++++++++++++++
 t/t0601-reffiles-pack-refs.sh        | 430 +-------------------------
 t/t1463-refs-optimize.sh             |  17 ++
 18 files changed, 650 insertions(+), 531 deletions(-)
 create mode 100644 Documentation/pack-refs-options.adoc
 create mode 100644 pack-refs.c
 create mode 100644 pack-refs.h
 create mode 100644 t/pack-refs-tests.sh
 create mode 100755 t/t1463-refs-optimize.sh
Range-diff against v2:
 -:  ---------- >  1:  a837ae6f5d refs: add a generic 'optimize' API
 -:  ---------- >  2:  e0613b14b6 files-backend: implement 'optimize' action
 -:  ---------- >  3:  ae8d2d29d9 reftable-backend: implement 'optimize' action
 -:  ---------- >  4:  a8cba8a355 builtin/pack-refs: convert to use the generic refs_optimize() API
 1:  67a9187b59 !  5:  ec1085ccd8 builtin/pack-refs: factor out core logic into a shared library
    @@ builtin/pack-refs.c
     -	if (!pack_refs_opts.includes->nr)
     -		string_list_append(pack_refs_opts.includes, "refs/tags/*");
     -
    --	ret = refs_pack_refs(get_main_ref_store(repo), &pack_refs_opts);
    --
    +-	ret = refs_optimize(get_main_ref_store(repo), &pack_refs_opts);
    + 
     -	clear_ref_exclusions(&excludes);
     -	string_list_clear(&included_refs, 0);
     -	string_list_clear(&option_excluded_refs, 0);
    @@ pack-refs.c (new)
     +	if (!pack_refs_opts.includes->nr)
     +		string_list_append(pack_refs_opts.includes, "refs/tags/*");
     +
    -+	ret = refs_pack_refs(get_main_ref_store(repo), &pack_refs_opts);
    ++	ret = refs_optimize(get_main_ref_store(repo), &pack_refs_opts);
     +
     +	clear_ref_exclusions(&excludes);
     +	string_list_clear(&included_refs, 0);
 2:  422eaa0c8b !  6:  e1758816bf doc: factor out common option
    @@ Metadata
     Author: Meet Soni <meetsoni3017@gmail.com>
     
      ## Commit message ##
    -    doc: factor out common option
    +    doc: pack-refs: factor out common options
     
         In preparation for adding documentation for `git refs optimize`, factor
         out the common options from the `git-pack-refs` man page into a
         shareable file `pack-refs-options.adoc` and update `git-pack-refs.adoc`
         to use an `include::` macro.
     
    -    This change is a pure refactoring and results in no change to the
    -    final rendered documentation for `pack-refs`.
    +    This change is a pure refactoring and results in no change to the final
    +    rendered documentation for `pack-refs`.
     
         Mentored-by: Patrick Steinhardt <ps@pks.im>
         Mentored-by: shejialuo <shejialuo@gmail.com>
    @@ Documentation/git-pack-refs.adoc: unpacked.
     -+
     -When used with `--include`, refs provided to `--include`, minus refs that are
     -provided to `--exclude` will be packed.
    --
     +include::pack-refs-options.adoc[]
      
    + 
      BUGS
    - ----
     
      ## Documentation/pack-refs-options.adoc (new) ##
     @@
 3:  067a2baa97 !  7:  e3a908fe72 builtin/refs: add optimize subcommand
    @@ Commit message
     
         As part of the ongoing effort to consolidate reference handling,
         introduce a new `optimize` subcommand. This command provides the same
    -    functionality and exit-code behavior as `git pack-refs`, serving
    -    as its modern replacement.
    +    functionality and exit-code behavior as `git pack-refs`, serving as its
    +    modern replacement.
     
         Implement `cmd_refs_optimize` by having it call the `pack_refs_core()`
         helper function. This helper was factored out of the original
    -    `cmd_pack_refs` in a preceding commit, allowing both commands to
    -    share the same core logic as independent peers.
    +    `cmd_pack_refs` in a preceding commit, allowing both commands to share
    +    the same core logic as independent peers.
     
         Add documentation for the new command. The man page leverages the shared
         options file, created in a previous commit, by using the AsciiDoc
    @@ Documentation/git-refs.adoc
     @@ Documentation/git-refs.adoc: git refs list [--count=<count>] [--shell|--perl|--python|--tcl]
      		   [--contains[=<object>]] [--no-contains[=<object>]]
      		   [(--exclude=<pattern>)...] [--start-after=<marker>]
    - 		   [ --stdin | <pattern>... ]
    + 		   [ --stdin | (<pattern>...)]
     +git refs optimize [--all] [--no-prune] [--auto] [--include <pattern>] [--exclude <pattern>]
      
      DESCRIPTION
    @@ builtin/refs.c: static int cmd_refs_list(int argc, const char **argv, const char
     +		REFS_OPTIMIZE_USAGE,
     +		NULL
     +	};
    ++
     +	return pack_refs_core(argc, argv, prefix, repo, refs_optimize_usage);
     +}
     +
 4:  640ebd9a4f !  8:  4f63632ac2 t0601: refactor tests to be shareable
    @@ Commit message
         variable and then sourcing the test library.
     
         This new structure follows the established pattern used for sharing
    -    tests between `git-for-each-ref` and `git-refs list` and prepares the test suite
    -    for the `refs optimize` tests to be added in a subsequent commit.
    +    tests between `git-for-each-ref` and `git-refs list` and prepares the
    +    test suite for the `refs optimize` tests to be added in a subsequent
    +    commit.
     
         Mentored-by: Patrick Steinhardt <ps@pks.im>
         Mentored-by: shejialuo <shejialuo@gmail.com>
 5:  37ca586bb9 =  9:  39eed2831a t: add test for git refs optimize subcommand
base-commit: f814da676ae46aac5be0a98b99373a76dee6cedb
-- 
2.34.1
Previous: Junio C HamanoNext: Meet Soni
Message 10 of 36 in “Add refs optimize subcommand”
  1. Meet SoniSep 6, 2025
  2. [GSoC][PATCH v2 1/5] builtin/pack-refs: factor out core logic into a shared libraryMeet Soni, Sep 6, 2025
  3. [GSoC][PATCH v2 2/5] doc: factor out common optionMeet Soni, Sep 6, 2025
  4. Junio C HamanoSep 8, 2025
  5. [GSoC][PATCH v2 3/5] builtin/refs: add optimize subcommandMeet Soni, Sep 6, 2025
  6. [GSoC][PATCH v2 4/5] t0601: refactor tests to be shareableMeet Soni, Sep 6, 2025
  7. [GSoC][PATCH v2 5/5] t: add test for git refs optimize subcommandMeet Soni, Sep 6, 2025
  8. Junio C HamanoSep 8, 2025
  9. Junio C HamanoSep 8, 2025
  10. [GSoC][PATCH v3 0/9] Add refs optimize subcommandMeet Soni, Sep 18, 2025
  11. [GSoC][PATCH v3 1/9] refs: add a generic 'optimize' APIMeet Soni, Sep 18, 2025
  12. shejialuoSep 18, 2025
  13. Junio C HamanoSep 18, 2025
  14. [GSoC][PATCH v3 2/9] files-backend: implement 'optimize' actionMeet Soni, Sep 18, 2025
  15. [GSoC][PATCH v3 3/9] reftable-backend: implement 'optimize' actionMeet Soni, Sep 18, 2025
  16. [GSoC][PATCH v3 4/9] builtin/pack-refs: convert to use the generic refs_optimize() APIMeet Soni, Sep 18, 2025
  17. shejialuoSep 18, 2025
  18. [GSoC][PATCH v3 5/9] builtin/pack-refs: factor out core logic into a shared libraryMeet Soni, Sep 18, 2025
  19. [GSoC][GSoC][PATCH v3 6/9] doc: pack-refs: factor out common optionsMeet Soni, Sep 18, 2025
  20. [GSoC][PATCH v3 7/9] builtin/refs: add optimize subcommandMeet Soni, Sep 18, 2025
  21. Junio C HamanoSep 18, 2025
  22. [GSoC][PATCH v3 8/9] t0601: refactor tests to be shareableMeet Soni, Sep 18, 2025
  23. [GSoC][PATCH v3 9/9] t: add test for git refs optimize subcommandMeet Soni, Sep 18, 2025
  24. [GSoC][PATCH v4 0/9] Add refs optimize subcommandMeet Soni, Sep 19, 2025
  25. [GSoC][PATCH v4 1/9] refs: add a generic 'optimize' APIMeet Soni, Sep 19, 2025
  26. Patrick SteinhardtSep 24, 2025
  27. [GSoC][PATCH v4 2/9] files-backend: implement 'optimize' actionMeet Soni, Sep 19, 2025
  28. [GSoC][PATCH v4 3/9] reftable-backend: implement 'optimize' actionMeet Soni, Sep 19, 2025
  29. [GSoC][PATCH v4 4/9] builtin/pack-refs: convert to use the generic refs_optimize() APIMeet Soni, Sep 19, 2025
  30. [GSoC][PATCH v4 5/9] builtin/pack-refs: factor out core logic into a shared libraryMeet Soni, Sep 19, 2025
  31. Patrick SteinhardtSep 24, 2025
  32. [GSoC][PATCH v4 6/9] doc: pack-refs: factor out common optionsMeet Soni, Sep 19, 2025
  33. [GSoC][PATCH v4 7/9] builtin/refs: add optimize subcommandMeet Soni, Sep 19, 2025
  34. [GSoC][PATCH v4 8/9] t0601: refactor tests to be shareableMeet Soni, Sep 19, 2025
  35. [GSoC][PATCH v4 9/9] t: add test for git refs optimize subcommandMeet Soni, Sep 19, 2025
  36. Junio C HamanoSep 19, 2025

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.