From: Junio C Hamano <gitster@pobox.com>
To: "Adithya Chakilam via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Martin Fick <mfick@nvidia.com>,
Christian Couder <christian.couder@gmail.com>,
Adithya Chakilam <achakilam@nvidia.com>
Subject: Re: [PATCH 1/2] repack: add --filter-to-loose to write filtered-out objects as loose objects
Date: Sat, 14 Nov 2026 12:08:57 -0800 [thread overview]
Message-ID: <xmqqmrrbnpk6.fsf@gitster.g> (raw)
In-Reply-To: <4488a1534ebe7def72055ab5530d4f03177fbe52.1794607911.git.gitgitgadget@gmail.com> (Adithya Chakilam via GitGitGadget's message of "Fri, 13 Nov 2026 22:11:50 +0000")
"Adithya Chakilam via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Adithya Chakilam <achakilam@nvidia.com>
>
> Some external object stores (like key-value) manage and retrieve git
> objects individually. Although repack's --filter-to option can separate
> objects from the main object store, it writes them into packs. Using
> those objects individually then requires an additional unpacking step.
>
> Add --filter-to-loose=<dir> to write filtered-out objects directly as
> loose objects into <dir>, treating it as an object directory. Stream
> the filtered pack into unpack-objects instead of writing an intermediate
> pack file to disk.
>
> The filtered pack is built with --stdin-packs, so this initially handles
> only objects already stored in packs. Loose objects in the source
> repository are left in place.
I haven't decided whether this new feature makes sense or not, so I
won't comment on that aspect. Take the following review comments
with that in mind (i.e., pretend as if I said "if we assume doing
this makes sense, then..." before every sentence).
> +--filter-to-loose=<dir>::
> + Like `--filter-to`, but treat `<dir>` as an object directory
> + and write the filtered out objects there as loose objects
> + instead of as a pack. Cannot be combined with `--filter-to`
> + or `--max-pack-size`. Objects already present in `<dir>` are
> + not rewritten. All objects are written before any existing
> + pack is removed.
We talk about "already present in ...", so presumably we require the
directory to exist before we run. Have a test that ensures that
passing a non-existing directory will make the command error out
before doing any real work.
> diff --git a/builtin/repack.c b/builtin/repack.c
> index 21835453c6..140a992f1b 100644
> --- a/builtin/repack.c
> +++ b/builtin/repack.c
> @@ -41,7 +41,7 @@ static const char *const git_repack_usage[] = {
> N_("git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]\n"
> "[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]\n"
> "[--write-midx[=<mode>]] [--name-hash-version=<n>] [--path-walk]\n"
> - "[--filter=<filter-spec>] [--drop-filtered [--dry-run]]"),
> + "[--filter=<filter-spec> [--filter-to-loose=<dir>]] [--drop-filtered [--dry-run]]"),
The above documentation and help text consistently tell us that the
value passed is a directory (do we use the abbreviated <dir> so
commonly? If not, it would make sense to spell it out, i.e.,
<directory>, for clarity).
> + OPT_STRING(0, "filter-to-loose", &filter_to_loose, N_("dir"),
> + N_("object directory to write filtered out objects into as loose objects")),
Here, too.
This should use OPT_FILENAME so that a "git repack" started from a
subdirectory with a relative path to the external loose object store
will find the directory at the correct place, I think. Have a test
to validate the combination to see that such a repack that was given
a relative path to a directory find ...
mkdir extra-loose-objects &&
mkdir sub/dir &&
(
cd sub/dir &&
git repack --filter-to-loose=../../extra-loose-objects ...
)
the directory correct at the right place.
> diff --git a/repack-filtered.c b/repack-filtered.c
> index 869b9fc6e3..51c9dfeb13 100644
> --- a/repack-filtered.c
> +++ b/repack-filtered.c
> @@ -29,10 +50,18 @@ int write_filtered_pack(const struct write_pack_opts *opts,
> strvec_pushf(&cmd.args, "--keep-pack=%s", item->string);
>
> cmd.in = -1;
> + if (opts->loose)
> + cmd.out = unpack.in;
>
> ret = start_command(&cmd);
> - if (ret)
> + if (ret) {
> + if (opts->loose) {
> + close(unpack.in);
Please double check that this is not closing the same thing twice.
IIRC, a failing start_command() would close all file descriptors
associated with cmd so you may have already closed unpack.in when
start_command() gave us a failure, which presumably closed cmd.out.
next prev parent reply other threads:[~2026-11-14 20:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-13 22:11 [PATCH 0/2] repack: write filtered-out objects as loose objects Adithya Chakilam via GitGitGadget
2026-11-13 22:11 ` [PATCH 1/2] repack: add --filter-to-loose to " Adithya Chakilam via GitGitGadget
2026-11-14 20:08 ` Junio C Hamano [this message]
2026-11-13 22:11 ` [PATCH 2/2] repack: also copy loose objects excluded by --filter-to-loose Adithya Chakilam via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqmrrbnpk6.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=achakilam@nvidia.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=mfick@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox