From 1ed91f6d255b76bdbdcccea7e1effcebbb263ced Mon Sep 17 00:00:00 2001 From: Derrick Stolee Date: Fri, 17 Dec 2021 10:31:02 -0500 Subject: [PATCH] repack: respect kept objects with '--write-midx -b' Historically, we needed a single packfile in order to have reachability bitmaps. This introduced logic that when 'git repack' had a '-b' option that we should stop sending the '--honor-pack-keep' option to the 'git pack-objects' child process, ensuring that we create a packfile containing all reachable objects. In the world of multi-pack-index bitmaps, we no longer need to repack all objects into a single pack to have valid bitmaps. Thus, we should continue sending the '--honor-pack-keep' flag to 'git pack-objects'. The fix is very simple: only disable the flag when writing bitmaps but also _not_ writing the multi-pack-index. This opens the door to new repacking strategies that might want to keep some historical set of objects in a stable pack-file while only repacking more recent objects. Signed-off-by: Derrick Stolee --- builtin/repack.c | 2 +- t/t7700-repack.sh | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/builtin/repack.c b/builtin/repack.c index 9b0be6a6ab318e..1f128b7c90b7ed 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -693,7 +693,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix) write_bitmaps = 0; } if (pack_kept_objects < 0) - pack_kept_objects = write_bitmaps > 0; + pack_kept_objects = write_bitmaps > 0 && !write_midx; if (write_bitmaps && !(pack_everything & ALL_INTO_ONE) && !write_midx) die(_(incremental_bitmap_conflict_error)); diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index 0260ad6f0e06ec..8c4ba6500be686 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -372,4 +372,19 @@ test_expect_success '--write-midx with preferred bitmap tips' ' ) ' +test_expect_success '--write-midx -b packs non-kept objects' ' + git init midx-kept && + test_when_finished "rm -fr midx-kept" && + ( + cd midx-kept && + test_commit_bulk 100 && + GIT_TRACE2_EVENT="$(pwd)/trace.txt" \ + git repack --write-midx -a -b && + cat trace.txt | \ + grep \"event\":\"start\" | \ + grep pack-objects | \ + grep \"--honor-pack-keep\" + ) +' + test_done