From: Christian Couder <christian.couder@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
John Cai <johncai86@gmail.com>,
Jonathan Tan <jonathantanmy@google.com>,
Jonathan Nieder <jrnieder@gmail.com>,
Taylor Blau <me@ttaylorr.com>, Derrick Stolee <stolee@gmail.com>,
Patrick Steinhardt <ps@pks.im>,
Christian Couder <christian.couder@gmail.com>
Subject: [PATCH v2 0/8] Repack objects into separate packfiles based on a filter
Date: Wed, 5 Jul 2023 08:08:04 +0200 [thread overview]
Message-ID: <20230705060812.2865188-1-christian.couder@gmail.com> (raw)
In-Reply-To: <20230614192541.1599256-1-christian.couder@gmail.com>
# Intro
Last year, John Cai sent 2 versions of a patch series to implement
`git repack --filter=<filter-spec>` and later I sent 4 versions of a
patch series trying to do it a bit differently:
- https://lore.kernel.org/git/pull.1206.git.git.1643248180.gitgitgadget@gmail.com/
- https://lore.kernel.org/git/20221012135114.294680-1-christian.couder@gmail.com/
In these patch series, the `--filter=<filter-spec>` removed the
filtered out objects altogether which was considered very dangerous
even though we implemented different safety checks in some of the
latter series.
In some discussions, it was mentioned that such a feature, or a
similar feature in `git gc`, or in a new standalone command (perhaps
called `git prune-filtered`), should put the filtered out objects into
a new packfile instead of deleting them.
Recently there were internal discussions at GitLab about either moving
blobs from inactive repos onto cheaper storage, or moving large blobs
onto cheaper storage. This lead us to rethink at repacking using a
filter, but moving the filtered out objects into a separate packfile
instead of deleting them.
So here is a new patch series doing that while implementing the
`--filter=<filter-spec>` option in `git repack`.
# Use cases for the new feature
This could be useful for example for the following purposes:
1) As a way for servers to save storage costs by for example moving
large blobs, or all the blobs, or all the blobs in inactive
repos, to separate storage (while still making them accessible
using for example the alternates mechanism).
2) As a way to use partial clone on a Git server to offload large
blobs to, for example, an http server, while using multiple
promisor remotes (to be able to access everything) on the client
side. (In this case the packfile that contains the filtered out
object can be manualy removed after checking that all the objects
it contains are available through the promisor remote.)
3) As a way for clients to reclaim some space when they cloned with
a filter to save disk space but then fetched a lot of unwanted
objects (for example when checking out old branches) and now want
to remove these unwanted objects. (In this case they can first
move the packfile that contains filtered out objects to a
separate directory or storage, then check that everything works
well, and then manually remove the packfile after some time.)
As the features and the code are quite different from those in the
previous series, I decided to start a new series instead of continuing
a previous one.
Also since this version 2 of this new series, commit messages, don't
mention uses cases like 2) or 3) above, as people have different
opinions on how it should be done. How it should be done could depend
a lot on the way promisor remotes are used, the software and hardware
setups used, etc, so it seems more difficult to "sell" this series by
talking about such use cases. As use case 1) seems simpler and more
appealing, it makes more sense to only talk about it in the commit
messages.
# Changes since version 1
Thanks to Junio and Taylor who reviewed version 1! The changes are the
following:
- I think that in the long run it might have been better for
performance reasons to implement the `--filter=...` in `git repack`
the way it was done in version 1.
(It was done by first implementing `git pack-objects
--print-filtered` to print objects omitted by a `--filter=...`
option, then having `git repack --filter=...` launch such a command,
read filtered out objects from it, and pipe them into a separate
`git pack-objects` process that would put them into a separate
packfile.)
Anyway our list-objects-filter API is currently not well suited for
that as it doesn't have a way to output the oids of the filtered out
objects while the filtering is happening. So version 1 had to get
them from an oid_set afterwards, which could use a lot of memory.
As I don't want to have to work on improving the list-objects-filter
API right now, I think it's better for now to just do as Taylor
suggested, and as what the cruft code is already doing, which is to
use the `--stdin-pack` option of `git pack-objects` and to pass it
packfile names, some prefixed with '^', to let it compute what
should be in the packfile(s) containing the filtered out objects and
then to create that(/those) packfile(s).
So patch 5/8 in version 2 which implements the
`--filter=<filter-spec>` option in `git repack` is very different
from patch 6/9 which implemented it in version 1.
- By doing it this way, this version gets rid of patch 2/9 in version
1 which added the `--print-filtered` option to pack-objects.
- We also get rid of patch 4/9 in version 1 which refactored
piping an oid to a command.
- On the other hand, we can refactor the code which finds the pack
prefix into a new small function as this will be needed by the new
code implementing `--filter=<filter-spec>`, so patch 4/8 in version
2 is new.
- As suggested by Taylor, a small test has been added to verify that
`--filter=blob:none` can work without `--stdout` in patch 1/8
(previously 1/9).
- In patch 3/8 (previously 5/9) which refactors the code to finish a
pack-objects command into a new function, the `is_local` bit is not
computed inside the new function anymore as suggested by both Junio
and Taylor.
- The commit messages of patch 5/8 (previously 6/9) and patch 7/8
(previously 8/9) that implement the `--filter=<filter-spec>` and
`--filter-to=<dir>` options respectively have been changed to not
talk about use cases related to promisor remotes as explained
towards the end of the "Use cases for the new feature" section
above.
- Also in patch 5/8 (previously 6/9) that implements the
`--filter=<filter-spec>`option, the documentation for this section
has been improved, suggesting to use it on bare repos along with -a
and -d to get the best possible filtering.
- And in patch 7/8 (previously 8/9) that implements the
`--filter-to=<dir>` option, a new test has been added to check that
`--filter=<filter-spec>` and `--filter-to=<dir>` work well with
the `--max-pack-size=...` option as suggested by Taylor.
- Also in patch 7/8 (previously 8/9) we now check that
`--filter=<filter-spec>` has been passed and error out if not, as it
doesn't make sense to use `--filter-to=<dir>` without
`--filter=<filter-spec>`. This was suggested by Taylor.
- To avoid small merge conflicts in the `git gc` doc, this series has
been rebased onto 9748a68200 (The sixth batch, 2023-06-29).
# Commit overview
* 1/8 pack-objects: allow `--filter` without `--stdout`
This patch is the same as the first patch in the previous series and
in v1. To be able to later repack with a filter we need `git
pack-objects` to write packfiles when it's filtering instead of just
writing the pack without the filtered out objects to stdout.
* 2/8 t/helper: add 'find-pack' test-tool
For testing `git repack --filter=...` that we are going to
implement, it's useful to have a test helper that can tell which
packfiles contain a specific object. No change in this patch
compared to v1.
* 3/8 repack: refactor finishing pack-objects command
This is a small refactoring creating a new useful function, so that
`git repack --filter=...` will be able to reuse it. The change
compared to v1 is that the `is_local` bit is not computed inside the
new function anymore.
* 4/8 repack: refactor finding pack prefix
This is a new patch with a small refactoring creating a small
function that will be reused in the next patch.
* 5/8 repack: add `--filter=<filter-spec>` option
This actually adds the `--filter=<filter-spec>` option. As explained
above it works differently than in v1. It now uses one `git
pack-objects` process with the `--filter` option. And then another
`git pack-objects` process with the `--stdin-packs` option. Also the
documentation of the new option has been improved compared to v1.
* 6/8 gc: add `gc.repackFilter` config option
This is a gc config option so that `git gc` can also repack using a
filter and put the filtered out objects into a separate packfile. No
changes compared to v1.
* 7/8 repack: implement `--filter-to` for storing filtered out objects
For some use cases, it's interesting to create the packfile that
contains the filtered out objects into a separate location. This is
similar to the `--expire-to` option for cruft packfiles. Since
version 1 we now check that `--filter=<filter-spec>` has been passed
as using `--filter-to` without it doesn't make sense. Also a new
test has been added to check that these options work well with
`--max-pack-size=...`.
* 8/8 gc: add `gc.repackFilterTo` config option
This allows specifying the location of the packfile that contains
the filtered out objects when using `gc.repackFilter`. No change
since v1.
# Range-diff
1: f4e1cc24d2 ! 1: 0bd1ad3071 pack-objects: allow `--filter` without `--stdout`
@@ builtin/pack-objects.c: int cmd_pack_objects(int argc, const char **argv, const
if (stdin_packs && use_internal_rev_list)
die(_("cannot use internal rev list with --stdin-packs"));
+
+ ## t/t5317-pack-objects-filter-objects.sh ##
+@@ t/t5317-pack-objects-filter-objects.sh: test_expect_success 'verify blob:none packfile has no blobs' '
+ ! grep blob verify_result
+ '
+
++test_expect_success 'verify blob:none packfile without --stdout' '
++ git -C r1 pack-objects --revs --filter=blob:none mypackname >packhash <<-EOF &&
++ HEAD
++ EOF
++ git -C r1 verify-pack -v "mypackname-$(cat packhash).pack" >verify_result &&
++ ! grep blob verify_result
++'
++
+ test_expect_success 'verify normal and blob:none packfiles have same commits/trees' '
+ git -C r1 verify-pack -v ../all.pack >verify_result &&
+ grep -E "commit|tree" verify_result |
2: 8cf3db088e < -: ---------- pack-objects: add `--print-filtered` to print omitted objects
3: 2f3b16281c = 2: e49cd723c7 t/helper: add 'find-pack' test-tool
4: 0021a5e3bb < -: ---------- repack: refactor piping an oid to a command
5: dce5087cc3 ! 3: 3f87772ea6 repack: refactor finishing pack-objects command
@@ builtin/repack.c: static void remove_redundant_bitmaps(struct string_list *inclu
+static int finish_pack_objects_cmd(struct child_process *cmd,
+ struct string_list *names,
-+ const char *destination)
++ int local)
+{
-+ int local = 1;
+ FILE *out;
+ struct strbuf line = STRBUF_INIT;
+
-+ if (destination) {
-+ const char *scratch;
-+ local = skip_prefix(destination, packdir, &scratch);
-+ }
-+
+ out = xfdopen(cmd->out, "r");
+ while (strbuf_getline_lf(&line, out) != EOF) {
+ struct string_list_item *item;
@@ builtin/repack.c: static int write_cruft_pack(const struct pack_objects_args *ar
- FILE *in, *out;
+ FILE *in;
int ret;
-- const char *scratch;
-- int local = skip_prefix(destination, packdir, &scratch);
-
- prepare_pack_objects(&cmd, args, destination);
-
+ const char *scratch;
+ int local = skip_prefix(destination, packdir, &scratch);
@@ builtin/repack.c: static int write_cruft_pack(const struct pack_objects_args *args,
fprintf(in, "%s.pack\n", item->string);
fclose(in);
@@ builtin/repack.c: static int write_cruft_pack(const struct pack_objects_args *ar
- strbuf_release(&line);
-
- return finish_command(&cmd);
-+ return finish_pack_objects_cmd(&cmd, names, destination);
++ return finish_pack_objects_cmd(&cmd, names, local);
}
int cmd_repack(int argc, const char **argv, const char *prefix)
@@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix
- strbuf_release(&line);
- fclose(out);
- ret = finish_command(&cmd);
-+ ret = finish_pack_objects_cmd(&cmd, &names, NULL);
++ ret = finish_pack_objects_cmd(&cmd, &names, 1);
if (ret)
goto cleanup;
6: fedde52ca1 < -: ---------- repack: add `--filter=<filter-spec>` option
-: ---------- > 4: 9997efaf33 repack: refactor finding pack prefix
-: ---------- > 5: da27ecb91b repack: add `--filter=<filter-spec>` option
7: 6ebd274334 ! 6: 49e4a184b4 gc: add `gc.repackFilter` config option
@@ Commit message
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
## Documentation/config/gc.txt ##
-@@ Documentation/config/gc.txt: or rebase occurring. Since these changes are not part of the current
- project most users will want to expire them sooner, which is why the
- default is more aggressive than `gc.reflogExpire`.
+@@ Documentation/config/gc.txt: Multiple hooks are supported, but all must exit successfully, else the
+ operation (either generating a cruft pack or unpacking unreachable
+ objects) will be halted.
+gc.repackFilter::
+ When repacking, use the specified filter to move certain
8: 5d68501b1f ! 7: 243c93aad3 repack: implement `--filter-to` for storing filtered out objects
@@ Commit message
accessible if, for example, the Git alternates mechanism is used to
point to it.
- If users want to remove a pack that contains filtered out objects after
- checking that they are all already on a promisor remote, creating the
- pack in a different directory makes it easier to do so.
+ While at it, as an example to show that `--filter` and `--filter-to`
+ work well with other options, let's also add a test to check that these
+ options work well with `--max-pack-size`.
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
+ repack: add test with --max-pack-size
+
## Documentation/git-repack.txt ##
@@ Documentation/git-repack.txt: depth is 4095.
- resulting packfile and put them into a separate packfile. See
- linkgit:git-rev-list[1] for valid `<filter-spec>` forms.
+ this option. See linkgit:git-rev-list[1] for valid
+ `<filter-spec>` forms.
+--filter-to=<dir>::
+ Write the pack containing filtered out objects to the
@@ Documentation/git-repack.txt: depth is 4095.
Write a reachability bitmap index as part of the repack. This
## builtin/repack.c ##
-@@ builtin/repack.c: static void prepare_pack_filtered_cmd(struct child_process *cmd,
- }
-
- static void finish_pack_filtered_cmd(struct child_process *cmd,
-- struct string_list *names)
-+ struct string_list *names,
-+ const char *destination)
- {
- if (cmd->in == -1) {
- /* No packed objects; cmd was never started */
-@@ builtin/repack.c: static void finish_pack_filtered_cmd(struct child_process *cmd,
-
- close(cmd->in);
-
-- if (finish_pack_objects_cmd(cmd, names, NULL, NULL))
-+ if (finish_pack_objects_cmd(cmd, names, destination, NULL))
- die(_("could not finish pack-objects to pack filtered objects"));
- }
-
@@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix)
+ int write_midx = 0;
const char *cruft_expiration = NULL;
const char *expire_to = NULL;
- struct child_process pack_filtered_cmd = CHILD_PROCESS_INIT;
+ const char *filter_to = NULL;
struct option builtin_repack_options[] = {
@@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix
strvec_push(&cmd.args, "--incremental");
}
-- if (po_args.filter)
-- prepare_pack_filtered_cmd(&pack_filtered_cmd, &po_args, packtmp);
-+ if (po_args.filter) {
-+ if (!filter_to)
-+ filter_to = packtmp;
-+ prepare_pack_filtered_cmd(&pack_filtered_cmd, &po_args, filter_to);
-+ }
-
++ if (filter_to && !po_args.filter)
++ die(_("option '%s' can only be used along with '%s'"), "--filter-to", "--filter");
++
if (geometry)
cmd.in = -1;
+ else
@@ builtin/repack.c: int cmd_repack(int argc, const char **argv, const char *prefix)
}
- if (po_args.filter)
-- finish_pack_filtered_cmd(&pack_filtered_cmd, &names);
-+ finish_pack_filtered_cmd(&pack_filtered_cmd, &names, filter_to);
-
- string_list_sort(&names);
-
+ if (po_args.filter) {
++ if (!filter_to)
++ filter_to = packtmp;
++
+ ret = write_filtered_pack(&po_args,
+- packtmp,
++ filter_to,
+ find_pack_prefix(),
+ &names,
+ &existing_nonkept_packs,
## t/t7700-repack.sh ##
@@ t/t7700-repack.sh: test_expect_success 'repacking with a filter works' '
@@ t/t7700-repack.sh: test_expect_success 'repacking with a filter works' '
+ blob_content=$(git -C bare.git show $blob_hash) &&
+ test "$blob_content" = "content1"
+'
++
++test_expect_success '--filter works with --max-pack-size' '
++ rm -rf filtered.git &&
++ git init --bare filtered.git &&
++ git init max-pack-size &&
++ (
++ cd max-pack-size &&
++ test_commit base &&
++ # two blobs which exceed the maximum pack size
++ test-tool genrandom foo 1048576 >foo &&
++ git hash-object -w foo &&
++ test-tool genrandom bar 1048576 >bar &&
++ git hash-object -w bar &&
++ git add foo bar &&
++ git commit -m "adding foo and bar"
++ ) &&
++ git clone --no-local --bare max-pack-size max-pack-size.git &&
++ (
++ cd max-pack-size.git &&
++ git -c repack.writebitmaps=false repack -a -d --filter=blob:none \
++ --max-pack-size=1M \
++ --filter-to=../filtered.git/objects/pack/pack &&
++ echo $(cd .. && pwd)/filtered.git/objects >objects/info/alternates &&
++
++ # Check that the 3 blobs are in different packfiles in filtered.git
++ test_stdout_line_count = 3 ls ../filtered.git/objects/pack/pack-*.pack &&
++ test_stdout_line_count = 1 ls objects/pack/pack-*.pack &&
++ foo_pack=$(test-tool find-pack HEAD:foo) &&
++ bar_pack=$(test-tool find-pack HEAD:bar) &&
++ base_pack=$(test-tool find-pack HEAD:base.t) &&
++ test "$foo_pack" != "$bar_pack" &&
++ test "$foo_pack" != "$base_pack" &&
++ test "$bar_pack" != "$base_pack" &&
++ for pack in "$foo_pack" "$bar_pack" "$base_pack"
++ do
++ case "$foo_pack" in */filtered.git/objects/pack/*) true ;; *) return 1 ;; esac
++ done
++ )
++'
+
objdir=.git/objects
midx=$objdir/pack/multi-pack-index
9: ae45d9845e = 8: 8cb3faa74c gc: add `gc.repackFilterTo` config option
Christian Couder (8):
pack-objects: allow `--filter` without `--stdout`
t/helper: add 'find-pack' test-tool
repack: refactor finishing pack-objects command
repack: refactor finding pack prefix
repack: add `--filter=<filter-spec>` option
gc: add `gc.repackFilter` config option
repack: implement `--filter-to` for storing filtered out objects
gc: add `gc.repackFilterTo` config option
Documentation/config/gc.txt | 11 ++
Documentation/git-pack-objects.txt | 4 +-
Documentation/git-repack.txt | 15 +++
Makefile | 1 +
builtin/gc.c | 10 ++
builtin/pack-objects.c | 8 +-
builtin/repack.c | 162 ++++++++++++++++++-------
t/helper/test-find-pack.c | 35 ++++++
t/helper/test-tool.c | 1 +
t/helper/test-tool.h | 1 +
t/t5317-pack-objects-filter-objects.sh | 8 ++
t/t6500-gc.sh | 23 ++++
t/t7700-repack.sh | 82 +++++++++++++
13 files changed, 311 insertions(+), 50 deletions(-)
create mode 100644 t/helper/test-find-pack.c
--
2.41.0.244.g8cb3faa74c
next prev parent reply other threads:[~2023-07-05 6:08 UTC|newest]
Thread overview: 161+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-14 19:25 [PATCH 0/9] Repack objects into separate packfiles based on a filter Christian Couder
2023-06-14 19:25 ` [PATCH 1/9] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-06-21 10:49 ` Taylor Blau
2023-07-05 6:16 ` Christian Couder
2023-06-14 19:25 ` [PATCH 2/9] pack-objects: add `--print-filtered` to print omitted objects Christian Couder
2023-06-15 22:50 ` Junio C Hamano
2023-06-21 10:52 ` Taylor Blau
2023-06-21 11:11 ` Christian Couder
2023-06-21 11:54 ` Taylor Blau
2023-06-14 19:25 ` [PATCH 3/9] t/helper: add 'find-pack' test-tool Christian Couder
2023-06-15 23:32 ` Junio C Hamano
2023-06-21 10:40 ` Christian Couder
2023-06-21 10:54 ` Taylor Blau
2023-06-14 19:25 ` [PATCH 4/9] repack: refactor piping an oid to a command Christian Couder
2023-06-15 23:46 ` Junio C Hamano
2023-06-21 10:55 ` Taylor Blau
2023-06-21 10:56 ` Christian Couder
2023-06-14 19:25 ` [PATCH 5/9] repack: refactor finishing pack-objects command Christian Couder
2023-06-16 0:13 ` Junio C Hamano
2023-06-21 11:06 ` Taylor Blau
2023-06-21 11:19 ` Christian Couder
2023-06-21 11:05 ` Taylor Blau
2023-06-14 19:25 ` [PATCH 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-06-16 0:43 ` Junio C Hamano
2023-06-21 11:20 ` Taylor Blau
2023-06-21 15:04 ` Christian Couder
2023-06-22 11:05 ` Taylor Blau
2023-06-21 14:40 ` Christian Couder
2023-06-21 16:53 ` Junio C Hamano
2023-06-22 8:39 ` Christian Couder
2023-06-22 18:32 ` Junio C Hamano
2023-06-21 11:17 ` Taylor Blau
2023-07-05 7:18 ` Christian Couder
2023-06-14 19:25 ` [PATCH 7/9] gc: add `gc.repackFilter` config option Christian Couder
2023-06-14 19:25 ` [PATCH 8/9] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-06-16 2:21 ` Junio C Hamano
2023-06-21 11:49 ` Taylor Blau
2023-06-21 12:08 ` Christian Couder
2023-06-21 12:25 ` Taylor Blau
2023-06-21 16:44 ` Junio C Hamano
2023-07-05 6:19 ` Christian Couder
2023-06-14 19:25 ` [PATCH 9/9] gc: add `gc.repackFilterTo` config option Christian Couder
2023-06-16 2:54 ` Junio C Hamano
2023-06-14 21:36 ` [PATCH 0/9] Repack objects into separate packfiles based on a filter Junio C Hamano
2023-06-16 3:08 ` Junio C Hamano
2023-07-05 6:08 ` Christian Couder [this message]
2023-07-05 6:08 ` [PATCH v2 1/8] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-07-05 6:08 ` [PATCH v2 2/8] t/helper: add 'find-pack' test-tool Christian Couder
2023-07-05 6:08 ` [PATCH v2 3/8] repack: refactor finishing pack-objects command Christian Couder
2023-07-05 6:08 ` [PATCH v2 4/8] repack: refactor finding pack prefix Christian Couder
2023-07-05 6:08 ` [PATCH v2 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-07-05 17:53 ` Junio C Hamano
2023-07-24 9:01 ` Christian Couder
2023-07-24 18:28 ` Junio C Hamano
2023-07-25 15:22 ` Christian Couder
2023-07-25 17:25 ` Junio C Hamano
2023-07-25 23:08 ` Junio C Hamano
2023-08-08 8:45 ` Christian Couder
2023-08-09 20:38 ` Taylor Blau
2023-08-09 22:50 ` Junio C Hamano
2023-08-09 23:38 ` Junio C Hamano
2023-08-10 0:10 ` Jeff King
2023-07-05 18:12 ` Junio C Hamano
2023-07-24 9:02 ` Christian Couder
2023-07-05 6:08 ` [PATCH v2 6/8] gc: add `gc.repackFilter` config option Christian Couder
2023-07-05 6:08 ` [PATCH v2 7/8] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-07-05 18:26 ` Junio C Hamano
2023-07-24 9:00 ` Christian Couder
2023-07-24 18:18 ` Junio C Hamano
2023-07-25 13:41 ` Robert Coup
2023-07-25 16:50 ` Junio C Hamano
2023-07-25 15:45 ` Christian Couder
2023-07-05 6:08 ` [PATCH v2 8/8] gc: add `gc.repackFilterTo` config option Christian Couder
2023-07-24 8:59 ` [PATCH v3 0/8] Repack objects into separate packfiles based on a filter Christian Couder
2023-07-24 8:59 ` [PATCH v3 1/8] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-07-25 22:38 ` Taylor Blau
2023-07-25 23:51 ` Junio C Hamano
2023-07-24 8:59 ` [PATCH v3 2/8] t/helper: add 'find-pack' test-tool Christian Couder
2023-07-25 22:44 ` Taylor Blau
2023-08-08 8:28 ` Christian Couder
2023-07-24 8:59 ` [PATCH v3 3/8] repack: refactor finishing pack-objects command Christian Couder
2023-07-25 22:45 ` Taylor Blau
2023-07-24 8:59 ` [PATCH v3 4/8] repack: refactor finding pack prefix Christian Couder
2023-07-25 22:47 ` Taylor Blau
2023-08-08 8:29 ` Christian Couder
2023-07-24 8:59 ` [PATCH v3 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-07-25 23:04 ` Taylor Blau
2023-08-08 8:34 ` Christian Couder
2023-08-09 21:12 ` Taylor Blau
2023-07-24 8:59 ` [PATCH v3 6/8] gc: add `gc.repackFilter` config option Christian Couder
2023-07-25 23:07 ` Taylor Blau
2023-08-08 8:38 ` Christian Couder
2023-08-09 21:15 ` Taylor Blau
2023-07-24 8:59 ` [PATCH v3 7/8] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-07-24 8:59 ` [PATCH v3 8/8] gc: add `gc.repackFilterTo` config option Christian Couder
2023-07-25 23:10 ` [PATCH v3 0/8] Repack objects into separate packfiles based on a filter Taylor Blau
2023-08-08 8:26 ` [PATCH v4 " Christian Couder
2023-08-08 8:26 ` [PATCH v4 1/8] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-08-08 8:26 ` [PATCH v4 2/8] t/helper: add 'find-pack' test-tool Christian Couder
2023-08-09 21:18 ` Taylor Blau
2023-08-08 8:26 ` [PATCH v4 3/8] repack: refactor finishing pack-objects command Christian Couder
2023-08-08 8:26 ` [PATCH v4 4/8] repack: refactor finding pack prefix Christian Couder
2023-08-09 21:20 ` Taylor Blau
2023-08-08 8:26 ` [PATCH v4 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-08-09 21:40 ` Taylor Blau
2023-08-08 8:26 ` [PATCH v4 6/8] gc: add `gc.repackFilter` config option Christian Couder
2023-08-08 8:26 ` [PATCH v4 7/8] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-08-08 8:26 ` [PATCH v4 8/8] gc: add `gc.repackFilterTo` config option Christian Couder
2023-08-09 21:45 ` [PATCH v4 0/8] Repack objects into separate packfiles based on a filter Taylor Blau
2023-08-09 21:57 ` Junio C Hamano
2023-08-12 0:12 ` Christian Couder
2023-08-12 0:00 ` [PATCH v5 " Christian Couder
2023-08-12 0:00 ` [PATCH v5 1/8] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-08-12 0:00 ` [PATCH v5 2/8] t/helper: add 'find-pack' test-tool Christian Couder
2023-08-12 0:00 ` [PATCH v5 3/8] repack: refactor finishing pack-objects command Christian Couder
2023-08-12 0:00 ` [PATCH v5 4/8] repack: refactor finding pack prefix Christian Couder
2023-08-12 0:00 ` [PATCH v5 5/8] repack: add `--filter=<filter-spec>` option Christian Couder
2023-08-12 0:00 ` [PATCH v5 6/8] gc: add `gc.repackFilter` config option Christian Couder
2023-08-12 0:00 ` [PATCH v5 7/8] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-08-12 0:00 ` [PATCH v5 8/8] gc: add `gc.repackFilterTo` config option Christian Couder
2023-08-15 0:51 ` [PATCH v5 0/8] Repack objects into separate packfiles based on a filter Junio C Hamano
2023-08-15 21:43 ` Taylor Blau
2023-08-15 22:32 ` Junio C Hamano
2023-08-15 23:09 ` Taylor Blau
2023-08-15 23:18 ` Junio C Hamano
2023-08-16 0:38 ` Taylor Blau
2023-08-16 17:16 ` Junio C Hamano
2023-09-11 15:20 ` Christian Couder
2023-09-11 15:06 ` [PATCH v6 0/9] " Christian Couder
2023-09-11 15:06 ` [PATCH v6 1/9] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-09-11 15:06 ` [PATCH v6 2/9] t/helper: add 'find-pack' test-tool Christian Couder
2023-09-11 15:06 ` [PATCH v6 3/9] repack: refactor finishing pack-objects command Christian Couder
2023-09-11 15:06 ` [PATCH v6 4/9] repack: refactor finding pack prefix Christian Couder
2023-09-11 15:06 ` [PATCH v6 5/9] pack-bitmap-write: rebuild using new bitmap when remapping Christian Couder
2023-09-11 15:06 ` [PATCH v6 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-09-11 15:06 ` [PATCH v6 7/9] gc: add `gc.repackFilter` config option Christian Couder
2023-09-11 15:06 ` [PATCH v6 8/9] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-09-11 15:06 ` [PATCH v6 9/9] gc: add `gc.repackFilterTo` config option Christian Couder
2023-09-25 15:25 ` [PATCH v7 0/9] Repack objects into separate packfiles based on a filter Christian Couder
2023-09-25 15:25 ` [PATCH v7 1/9] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-09-25 15:25 ` [PATCH v7 2/9] t/helper: add 'find-pack' test-tool Christian Couder
2023-09-25 15:25 ` [PATCH v7 3/9] repack: refactor finishing pack-objects command Christian Couder
2023-09-25 15:25 ` [PATCH v7 4/9] repack: refactor finding pack prefix Christian Couder
2023-09-25 15:25 ` [PATCH v7 5/9] pack-bitmap-write: rebuild using new bitmap when remapping Christian Couder
2023-09-25 15:25 ` [PATCH v7 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-09-25 15:25 ` [PATCH v7 7/9] gc: add `gc.repackFilter` config option Christian Couder
2023-09-25 15:25 ` [PATCH v7 8/9] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-09-25 15:25 ` [PATCH v7 9/9] gc: add `gc.repackFilterTo` config option Christian Couder
2023-09-25 19:14 ` [PATCH v7 0/9] Repack objects into separate packfiles based on a filter Junio C Hamano
2023-09-25 22:41 ` Taylor Blau
2023-10-02 16:54 ` [PATCH v8 " Christian Couder
2023-10-02 16:54 ` [PATCH v8 1/9] pack-objects: allow `--filter` without `--stdout` Christian Couder
2023-10-02 16:54 ` [PATCH v8 2/9] t/helper: add 'find-pack' test-tool Christian Couder
2023-10-02 16:54 ` [PATCH v8 3/9] repack: refactor finishing pack-objects command Christian Couder
2023-10-02 16:54 ` [PATCH v8 4/9] repack: refactor finding pack prefix Christian Couder
2023-10-02 16:55 ` [PATCH v8 5/9] pack-bitmap-write: rebuild using new bitmap when remapping Christian Couder
2023-10-02 16:55 ` [PATCH v8 6/9] repack: add `--filter=<filter-spec>` option Christian Couder
2023-10-02 16:55 ` [PATCH v8 7/9] gc: add `gc.repackFilter` config option Christian Couder
2023-10-02 16:55 ` [PATCH v8 8/9] repack: implement `--filter-to` for storing filtered out objects Christian Couder
2023-10-02 16:55 ` [PATCH v8 9/9] gc: add `gc.repackFilterTo` config option Christian Couder
2023-10-02 20:14 ` [PATCH v8 0/9] Repack objects into separate packfiles based on a filter Taylor Blau
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=20230705060812.2865188-1-christian.couder@gmail.com \
--to=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johncai86@gmail.com \
--cc=jonathantanmy@google.com \
--cc=jrnieder@gmail.com \
--cc=me@ttaylorr.com \
--cc=ps@pks.im \
--cc=stolee@gmail.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).