From: Maciej Ciemborowicz Date: Sat, 19 Sep 2026 20:11:55 GMT Subject: [PATCH 0/3] refs: report old OIDs for batched deletions Message-ID: <20260919201158.43415-1-maciej.ciemborowicz@gmail.com> In-Reply-To: This follows up on the reference-transaction bug report at [1]. The reference-transaction hook reports an all-zero update when `git branch -d`, `git tag -d`, `git remote prune`, or `git fetch --prune` deletes a ref. This prevents hook consumers from identifying the object that the ref pointed to. For branch and tag deletion, this is a regression caused by 8198907795 (use delete_refs when deleting tags or branches, 2021-01-21). That change made large deletions much faster by batching them, but the batch helper did not accept the old OIDs that both callers had already resolved. The pruning paths have the same omission. Teach refs_delete_refs() to accept optional old OIDs, then pass the values already available to the branch, tag, fetch, and remote callers. This keeps a single batched transaction and does not add any ref reads. Deleting 10,000 packed tags took a median of 0.86 seconds before this series and 0.85 seconds after it across five runs, which is within measurement noise. The regression tests use packed refs and cover the files and reftable backends, distinct old OIDs, and regular and atomic fetch pruning. The full test suite passes with DEVELOPER=1. Additional checks covered SHA-1, SHA-256, broken and symbolic refs, and refs shadowed between loose and packed storage. [1] https://lore.kernel.org/git/CACQ=SRGTTdQ+dHXhN6F52dBv5KxZBRfk_Em2fvmEmGJDoB6oTg@mail.gmail.com/ Maciej Ciemborowicz (3): refs: allow callers to supply old OIDs for batch deletion branch, tag: retain old OIDs in batched deletions fetch, remote: retain old OIDs when pruning refs bisect.c | 2 +- builtin/branch.c | 7 +++- builtin/fetch.c | 11 +++-- builtin/remote.c | 33 ++++++++++++--- builtin/tag.c | 7 +++- refs.c | 26 +++++++----- refs.h | 12 +++++- t/helper/test-ref-store.c | 2 +- t/t1416-ref-transaction-hooks.sh | 70 ++++++++++++++++++++++++++++++++ 9 files changed, 144 insertions(+), 26 deletions(-) base-commit: e9019fcafe0040228b8631c30f97ae1adb61bcdc -- 2.39.3 (Apple Git-146)