Jeff King <[email protected]> wrote:
> Pruning generally has to traverse the whole commit graph in order to
> see which objects are reachable. This is the exact problem that
> reachability bitmaps were meant to solve, so let's use them (if they're
> available, of course).
Perhaps this is good impetus for doing bitmaps by default?
It would make life easier for people new to hosting git servers
(and hopefully reduce centralization :)
I started working on it, but t0410-partial-clone.sh fails with
"Failed to write bitmap index. Packfile doesn't have full
closure"; so more work needs to be done w.r.t. default behavior
on partial clones...
Here's my WIP:
diff --git a/builtin/repack.c b/builtin/repack.c
index 67f8978043..ca98d32715 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -14,7 +14,7 @@
static int delta_base_offset = 1;
static int pack_kept_objects = -1;
-static int write_bitmaps;
+static int write_bitmaps = -1;
static int use_delta_islands;
static char *packdir, *packtmp;
@@ -344,10 +344,14 @@ int cmd_repack(int argc, const char **argv, const char
*prefix)
die(_("--keep-unreachable and -A are incompatible"));
if (pack_kept_objects < 0)
- pack_kept_objects = write_bitmaps;
+ pack_kept_objects = write_bitmaps > 0;
- if (write_bitmaps && !(pack_everything & ALL_INTO_ONE))
- die(_(incremental_bitmap_conflict_error));
+ if (!(pack_everything & ALL_INTO_ONE)) {
+ if (write_bitmaps > 0)
+ die(_(incremental_bitmap_conflict_error));
+ } else if (write_bitmaps < 0) {
+ write_bitmaps = 1;
+ }
packdir = mkpathdup("%s/pack", get_object_directory());
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
@@ -368,7 +372,7 @@ int cmd_repack(int argc, const char **argv, const char
*prefix)
argv_array_push(&cmd.args, "--indexed-objects");
if (repository_format_partial_clone)
argv_array_push(&cmd.args, "--exclude-promisor-objects");
- if (write_bitmaps)
+ if (write_bitmaps > 0)
argv_array_push(&cmd.args, "--write-bitmap-index");
if (use_delta_islands)
argv_array_push(&cmd.args, "--delta-islands");