On Fri, Oct 23, 2020 at 03:57:21PM -0400, Taylor Blau wrote: > It should be possible to keep track of the old and new OIDs via a > non-copied pointer, but I have to untangle this code a little bit more > before I can be sure. This may be both easier and harder than I was imagining ;-). In the easier direction, the following patch is sufficient to get the tests passing again: diff --git a/refs/files-backend.c b/refs/files-backend.c index 04e85e7002..744c93b7ff 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -2311,12 +2311,11 @@ static int split_symref_update(struct ref_update *update, new_update->parent_update = update; /* - * Change the symbolic ref update to log only. Also, it - * doesn't need to check its old OID value, as that will be - * done when new_update is processed. + * Change the symbolic ref update to log only. Though we don't + * need to check its old OID value, leave REF_HAVE_OLD alone so + * we can propagate it to the ref transaction hook. */ update->flags |= REF_LOG_ONLY | REF_NO_DEREF; - update->flags &= ~REF_HAVE_OLD; /* * Add the referent. This insertion is O(N) in the transaction But, it also means that we're now needlessly re-verifying the before state of symrefs (or so I think, I haven't yet proved it one way or the other). So, I need to look into that before deciding if this is a good direction to go. Thanks, Taylor