unseen: full-objects clone instead of blob:none promisor (bulk pack, no lazy per-blob fetch)

The harvester cloned --filter=blob:none --no-checkout, then blame/log/diff
triggered the promisor to fetch each needed blob ON DEMAND -- hundreds of
round-trips per repo, the dominant cost that made the draw unable to
converge. The blobless clone was a premature optimization that backfired.

Drop --filter=blob:none from the clone and the two commit fetches. A
full-objects --no-checkout clone brings the whole commit graph AND every
blob in one pack, so blame/log/diff read locally; --no-checkout still
skips the working tree so disk stays bounded (plus the existing 500 MiB
clone_size_cap and the disk guard). With no promisor remote, a genuinely
missing object now errors loudly instead of silently round-tripping --
the instrument guarantee that the bulk fetch was complete.

Extraction semantics are unchanged (same SZZ introducing-commit positive,
same stratified ordinary negatives, byte-identical entries); only the
object-transfer strategy changes. Test inverted to assert no blob:none
filter on the clone; README updated. 145 unseen tests pass, ruff clean.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Marius Ciepluch
2026-10-10 15:53:05 +02:00
co-authored by Claude Opus 4.8
parent f712b2cffa
commit 00a1fdb30f
3 changed files with 22 additions and 10 deletions
+5 -1
View File
@@ -100,7 +100,11 @@ def test_cache_is_outside_repository_deleted_and_partial(tmp_path):
assert git.path.exists()
clone_path = git.path
assert not clone_path.exists()
assert "--filter=blob:none" in calls[0] and "--no-checkout" in calls[0]
# Full-objects clone: no blob:none promisor (which caused per-blob lazy
# fetches), so every blob arrives in one pack and a missing object errors
# loudly. --no-checkout still skips the working tree.
assert "--filter=blob:none" not in calls[0] and "--no-checkout" in calls[0]
assert "clone" in calls[0]
assert clones.counts["clones"] == 1 and clones.counts["clone_bytes"] == 3