repack: consider bitmaps when performing repacks

Since `pack-objects` will write a `.bitmap` file next to the `.pack` and
`.idx` files, this commit teaches `git-repack` to consider the new
bitmap indexes (if they exist) when performing repack operations.

This implies moving old bitmap indexes out of the way if we are
repacking a repository that already has them, and moving the newly
generated bitmap indexes into the `objects/pack` directory, next to
their corresponding packfiles.

Since `git repack` is now capable of handling these `.bitmap` files,
a normal `git gc` run on a repository that has `pack.writebitmaps` set
to true in its config file will generate bitmap indexes as part of the
garbage collection process.

Alternatively, `git repack` can be called with the `-b` switch to
explicitly generate bitmap indexes if you are experimenting
and don't want them on all the time.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Vicent Marti 2013-12-21 09:00:31 -05:00 committed by Junio C Hamano
parent b77fcd1edc
commit 5cf2741c5a
2 changed files with 16 additions and 2 deletions

View File

@ -9,7 +9,7 @@ git-repack - Pack unpacked objects in a repository
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [--window=<n>] [--depth=<n>] 'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [--window=<n>] [--depth=<n>]


DESCRIPTION DESCRIPTION
----------- -----------
@ -110,6 +110,13 @@ other objects in that pack they already have locally.
The default is unlimited, unless the config variable The default is unlimited, unless the config variable
`pack.packSizeLimit` is set. `pack.packSizeLimit` is set.


-b::
--write-bitmap-index::
Write a reachability bitmap index as part of the repack. This
only makes sense when used with `-a` or `-A`, as the bitmaps
must be able to refer to all reachable objects. This option
overrides the setting of `pack.writebitmaps`.



Configuration Configuration
------------- -------------

View File

@ -94,7 +94,7 @@ static void get_non_kept_pack_filenames(struct string_list *fname_list)


static void remove_redundant_pack(const char *dir_name, const char *base_name) static void remove_redundant_pack(const char *dir_name, const char *base_name)
{ {
const char *exts[] = {".pack", ".idx", ".keep"}; const char *exts[] = {".pack", ".idx", ".keep", ".bitmap"};
int i; int i;
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
size_t plen; size_t plen;
@ -121,6 +121,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
} exts[] = { } exts[] = {
{".pack"}, {".pack"},
{".idx"}, {".idx"},
{".bitmap", 1},
}; };
struct child_process cmd; struct child_process cmd;
struct string_list_item *item; struct string_list_item *item;
@ -143,6 +144,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
int no_update_server_info = 0; int no_update_server_info = 0;
int quiet = 0; int quiet = 0;
int local = 0; int local = 0;
int write_bitmap = -1;


struct option builtin_repack_options[] = { struct option builtin_repack_options[] = {
OPT_BIT('a', NULL, &pack_everything, OPT_BIT('a', NULL, &pack_everything,
@ -161,6 +163,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
OPT__QUIET(&quiet, N_("be quiet")), OPT__QUIET(&quiet, N_("be quiet")),
OPT_BOOL('l', "local", &local, OPT_BOOL('l', "local", &local,
N_("pass --local to git-pack-objects")), N_("pass --local to git-pack-objects")),
OPT_BOOL('b', "write-bitmap-index", &write_bitmap,
N_("write bitmap index")),
OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"), OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"),
N_("with -A, do not loosen objects older than this")), N_("with -A, do not loosen objects older than this")),
OPT_INTEGER(0, "window", &window, OPT_INTEGER(0, "window", &window,
@ -202,6 +206,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_pushf(&cmd_args, "--no-reuse-delta"); argv_array_pushf(&cmd_args, "--no-reuse-delta");
if (no_reuse_object) if (no_reuse_object)
argv_array_pushf(&cmd_args, "--no-reuse-object"); argv_array_pushf(&cmd_args, "--no-reuse-object");
if (write_bitmap >= 0)
argv_array_pushf(&cmd_args, "--%swrite-bitmap-index",
write_bitmap ? "" : "no-");


if (pack_everything & ALL_INTO_ONE) { if (pack_everything & ALL_INTO_ONE) {
get_non_kept_pack_filenames(&existing_packs); get_non_kept_pack_filenames(&existing_packs);