> diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c > index f2f0b6b2c2..d2d46ff5f4 100644 > --- a/pack-bitmap-write.c > +++ b/pack-bitmap-write.c > @@ -333,6 +333,7 @@ void bitmap_writer_build(struct packing_data *to_pack) > struct commit *commit = bb.commits[i-1]; > struct bb_commit *ent = bb_data_at(&bb.data, commit); > struct commit *child; > + int reused = 0; > > fill_bitmap_commit(ent, commit); > Before the following chunk is the start of a loop: "while ((child = pop_commit(&ent->children))) {" > @@ -348,10 +349,15 @@ void bitmap_writer_build(struct packing_data *to_pack) > > if (child_ent->bitmap) > bitmap_or(child_ent->bitmap, ent->bitmap); > - else > + else if (reused) > child_ent->bitmap = bitmap_dup(ent->bitmap); > + else { > + child_ent->bitmap = ent->bitmap; > + reused = 1; > + } > } > - bitmap_free(ent->bitmap); > + if (!reused) > + bitmap_free(ent->bitmap); > ent->bitmap = NULL; > } > bitmap_builder_clear(&bb); > -- > 2.29.2.312.gabc4d358d8 So this is clearly correct. I asked myself if this optimization is worth it when we're going to drastically reduce the number of steps in patch 18, but I think that the answer is still yes.