From bb5da75d6116c35924a04a418ef4c3182663d0a2 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Mon, 16 Feb 2026 16:38:03 +0100 Subject: commit: use commit graph in `lookup_commit_reference_gently()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the preceding commit we refactored `lookup_commit_reference_gently()` so that it doesn't parse non-commit objects anymore. This has led to a speedup when git-receive-pack(1) accepts a shallow push into a repo with lots of refs that point to blobs or trees. But while this case is now faster, we still have the issue that accepting pushes with lots of "normal" refs that point to commits are still slow. This is mostly because we look up the commits via the object database, and that is rather costly. Adapt the code to use `repo_parse_commit_gently()` instead of `parse_object()` to parse the resulting commit object. This function knows to use the commit-graph to fill in the object, which is way more cost efficient. This leads to another significant speedup when accepting shallow pushes. The following benchmark pushes a single objects from a shallow clone into a repository with 600,000 references that all point to commits: Benchmark 1: git-receive-pack (rev = HEAD~) Time (mean ± σ): 9.179 s ± 0.031 s [User: 8.858 s, System: 0.528 s] Range (min … max): 9.154 s … 9.213 s 3 runs Benchmark 2: git-receive-pack (rev = HEAD) Time (mean ± σ): 2.337 s ± 0.032 s [User: 2.331 s, System: 0.234 s] Range (min … max): 2.308 s … 2.371 s 3 runs Summary git-receive-pack . Signed-off-by: Junio C Hamano --- commit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/commit.c b/commit.c index fb1b01b9c3..25cdbd3be4 100644 --- a/commit.c +++ b/commit.c @@ -45,7 +45,7 @@ struct commit *lookup_commit_reference_gently(struct repository *r, { const struct object_id *maybe_peeled; struct object_id peeled_oid; - struct object *object; + struct commit *commit; enum object_type type; switch (peel_object_ext(r, oid, &peeled_oid, 0, &type)) { @@ -67,11 +67,11 @@ struct commit *lookup_commit_reference_gently(struct repository *r, return NULL; } - object = parse_object(r, maybe_peeled); - if (!object) + commit = lookup_commit(r, maybe_peeled); + if (!commit || repo_parse_commit_gently(r, commit, quiet) < 0) return NULL; - return object_as_type(object, OBJ_COMMIT, quiet); + return commit; } struct commit *lookup_commit_reference(struct repository *r, const struct object_id *oid) -- cgit v1.3