Ok, now I understand your point.

Even on a non-empty repository, a large percentage of the blob objects received will be new and streaming would be efficient, as they don't need to access the data twice.  If however a blob already exists, we already have to do disk IO to load the existing blob.  Doing another disk IO to load back part of this pack is bad, but we're already suffering disk IO to load the existing blob.

Maybe its OK to just always stream blobs and take a double IO hit anytime this blob already exists.