Maciej Ciemborowicz reported that git branch -m old new does not give the reference-transaction hook both ref changes. On Git 2.55, the files backend reports the deletion of refs/heads/old but not the creation of refs/heads/new. The reftable backend reports no usable rename payload. The equivalent update-ref --stdin transaction reports both updates correctly.
He followed up with a patch series that puts the logical ref updates and reflog history of copy and rename into ordinary transactions, so hooks can observe and reject the whole operation. The cover letter thanks Patrick Steinhardt, Junio C Hamano and Karthik Nayak for feedback on v2. It says this version replays reflog history through ref_transaction_update_reflog(), the API used by backend migration.
The series adds ref_transaction_replace_reflog() to discard existing destination history before installing the queued entries. It adds an internal-only transaction flag so that nested packed-refs updates are not reported to hooks a second time. A final patch removes the old copy and rename callbacks and backend implementations, 656 deletions in all.
Junio C Hamano said he did not have time soon to review the patches closely, some of which exceed 1000 lines. He applied them to master at 6de20f6092 and reported that they break t0600 (the 'delete fails cleanly if packed-refs.new write fails' test) and t5510. He said the failures do not look platform-specific and asked whether the tests passed for the author. The excerpts do not show a reply.