Merge branch 'dt/disable-bitmap-in-auto-gc' into maint
It is natural that "git gc --auto" may not attempt to pack everything into a single pack, and there is no point in warning when the user has configured the system to use the pack bitmap, leading to disabling further "gc". * dt/disable-bitmap-in-auto-gc: repack: die on incremental + write-bitmap-index auto gc: don't write bitmaps for incremental repacks
This commit is contained in:
commit
81037171a5
@ -191,6 +191,11 @@ static void add_repack_all_option(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void add_repack_incremental_option(void)
|
||||||
|
{
|
||||||
|
argv_array_push(&repack, "--no-write-bitmap-index");
|
||||||
|
}
|
||||||
|
|
||||||
static int need_to_gc(void)
|
static int need_to_gc(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -208,7 +213,9 @@ static int need_to_gc(void)
|
|||||||
*/
|
*/
|
||||||
if (too_many_packs())
|
if (too_many_packs())
|
||||||
add_repack_all_option();
|
add_repack_all_option();
|
||||||
else if (!too_many_loose_objects())
|
else if (too_many_loose_objects())
|
||||||
|
add_repack_incremental_option();
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (run_hook_le(NULL, "pre-auto-gc", NULL))
|
if (run_hook_le(NULL, "pre-auto-gc", NULL))
|
||||||
|
@ -18,6 +18,12 @@ static const char *const git_repack_usage[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char incremental_bitmap_conflict_error[] = N_(
|
||||||
|
"Incremental repacks are incompatible with bitmap indexes. Use\n"
|
||||||
|
"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
static int repack_config(const char *var, const char *value, void *cb)
|
static int repack_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
if (!strcmp(var, "repack.usedeltabaseoffset")) {
|
if (!strcmp(var, "repack.usedeltabaseoffset")) {
|
||||||
@ -206,6 +212,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
|
|||||||
if (pack_kept_objects < 0)
|
if (pack_kept_objects < 0)
|
||||||
pack_kept_objects = write_bitmaps;
|
pack_kept_objects = write_bitmaps;
|
||||||
|
|
||||||
|
if (write_bitmaps && !(pack_everything & ALL_INTO_ONE))
|
||||||
|
die(_(incremental_bitmap_conflict_error));
|
||||||
|
|
||||||
packdir = mkpathdup("%s/pack", get_object_directory());
|
packdir = mkpathdup("%s/pack", get_object_directory());
|
||||||
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
|
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
|
||||||
|
|
||||||
|
@ -118,12 +118,10 @@ test_expect_success 'fetch (partial bitmap)' '
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'incremental repack cannot create bitmaps' '
|
test_expect_success 'incremental repack fails when bitmaps are requested' '
|
||||||
test_commit more-1 &&
|
test_commit more-1 &&
|
||||||
find .git/objects/pack -name "*.bitmap" >expect &&
|
test_must_fail git repack -d 2>err &&
|
||||||
git repack -d &&
|
test_i18ngrep "Incremental repacks are incompatible with bitmap" err
|
||||||
find .git/objects/pack -name "*.bitmap" >actual &&
|
|
||||||
test_cmp expect actual
|
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'incremental repack can disable bitmaps' '
|
test_expect_success 'incremental repack can disable bitmaps' '
|
||||||
|
@ -43,4 +43,29 @@ test_expect_success 'gc is not aborted due to a stale symref' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'auto gc with too many loose objects does not attempt to create bitmaps' '
|
||||||
|
test_config gc.auto 3 &&
|
||||||
|
test_config gc.autodetach false &&
|
||||||
|
test_config pack.writebitmaps true &&
|
||||||
|
# We need to create two object whose sha1s start with 17
|
||||||
|
# since this is what git gc counts. As it happens, these
|
||||||
|
# two blobs will do so.
|
||||||
|
test_commit 263 &&
|
||||||
|
test_commit 410 &&
|
||||||
|
# Our first gc will create a pack; our second will create a second pack
|
||||||
|
git gc --auto &&
|
||||||
|
ls .git/objects/pack | sort >existing_packs &&
|
||||||
|
test_commit 523 &&
|
||||||
|
test_commit 790 &&
|
||||||
|
|
||||||
|
git gc --auto 2>err &&
|
||||||
|
test_i18ngrep ! "^warning:" err &&
|
||||||
|
ls .git/objects/pack/ | sort >post_packs &&
|
||||||
|
comm -1 -3 existing_packs post_packs >new &&
|
||||||
|
comm -2 -3 existing_packs post_packs >del &&
|
||||||
|
test_line_count = 0 del && # No packs are deleted
|
||||||
|
test_line_count = 2 new # There is one new pack and its .idx
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user