From: Taylor Blau Date: Wed, 12 Mar 2025 21:14:14 GMT Subject: Re: [PATCH 02/13] pack-objects: add --path-walk option Message-ID: In-Reply-To: <9b31dc87bb61f4d73eced02a24baea58bc51aa5e.1741571455.git.gitgitgadget@gmail.com> On Mon, Mar 10, 2025 at 01:50:44AM +0000, Derrick Stolee via GitGitGadget wrote: > From: Derrick Stolee > > In order to more easily compute delta bases among objects that appear at > the exact same path, add a --path-walk option to 'git pack-objects'. > > This option will use the path-walk API instead of the object walk given > by the revision machinery. Since objects will be provided in batches > representing a common path, those objects can be tested for delta bases > immediately instead of waiting for a sort of the full object list by > name-hash. This has multiple benefits, including avoiding collisions by > name-hash. > > The objects marked as UNINTERESTING are included in these batches, so we > are guaranteeing some locality to find good delta bases. > > After the individual passes are done on a per-path basis, the default > name-hash is used to find other opportunistic delta bases that did not > match exactly by the full path name. > > The current implementation performs delta calculations while walking > objects, which is not ideal for a few reasons. First, this will cause > the "Enumerating objects" phase to be much longer than usual. Second, it > does not take advantage of threading during the path-scoped delta > calculations. Even with this lack of threading, the path-walk option is > sometimes faster than the usual approach. Future changes will refactor > this code to allow for threading, but that complexity is deferred until > later to keep this patch as simple as possible. > > This new walk is incompatible with some features and is ignored by > others: > > * Object filters are not currently integrated with the path-walk API, > such as sparse-checkout or tree depth. A blobless packfile could be > integrated easily, but that is deferred for later. > > * Server-focused features such as delta islands, shallow packs, and > using a bitmap index are incompatible with the path-walk API. > > * The path walk API is only compatible with the --revs option, not > taking object lists or pack lists over stdin. These alternative ways > to specify the objects currently ignores the --path-walk option > without even a warning. > > Future changes will create performance tests that demonstrate the power > of this approach. > > Signed-off-by: Derrick Stolee > --- > Documentation/git-pack-objects.adoc | 13 +- > Documentation/technical/api-path-walk.adoc | 1 + > builtin/pack-objects.c | 147 +++++++++++++++++++-- > t/t5300-pack-object.sh | 15 +++ > 4 files changed, 166 insertions(+), 10 deletions(-) > > diff --git a/Documentation/git-pack-objects.adoc b/Documentation/git-pack-objects.adoc > index 7f69ae4855f..7dbbe6d54d2 100644 > --- a/Documentation/git-pack-objects.adoc > +++ b/Documentation/git-pack-objects.adoc > @@ -16,7 +16,7 @@ SYNOPSIS > [--cruft] [--cruft-expiration=