When a parent blob already has chunks queued up for blaming, dropping the blob at the end of one blame step will cause it to get reloaded right away, doubling the amount of I/O and unpacking when processing a linear history. Keeping such parent blobs in memory seems like a reasonable optimization. It's conceivable that this may incur additional memory pressure particularly when the history contains lots of merges from long-diverged branches. In practice, this optimization appears to behave quite benignly, and a viable strategy for limiting the total amount of cached blobs in a useful manner seems rather hard to implement. In addition, calling git-blame with -C leads to similar memory retention patterns. --- builtin/blame.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/builtin/blame.c b/builtin/blame.c index 21f42b0..2596fbc 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -1556,7 +1556,8 @@ finish: } for (i = 0; i < num_sg; i++) { if (sg_origin[i]) { - drop_origin_blob(sg_origin[i]); + if (!sg_origin[i]->suspects) + drop_origin_blob(sg_origin[i]); origin_decref(sg_origin[i]); } } -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html