Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- Notes: When this patch series is applied, you only have 3 occurences of force_write. 1. In the struct as an undocumented int. 2. In lock_ref_sha1_basic: if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) lock->force_write = 1; 3: In ref_transaction_commit: /* Perform updates first so live commits remain referenced */ for (i = 0; i < n; i++) { struct ref_update *update = updates[i]; if (!is_null_sha1(update->new_sha1)) { if (!update->lock->force_write && !hashcmp(update->lock->old_sha1, update->new_sha1)) { unlock_ref(update->lock); update->lock = NULL; } else if (write_ref_sha1(update->lock, update->new_sha1, update->msg)) { update->lock = NULL; /* freed by write_ref_sha1 */ strbuf_addf(err, "Cannot update the ref '%s'.", update->refname); ret = TRANSACTION_GENERIC_ERROR; goto cleanup; } else { /* freed by write_ref_sha1(): */ update->lock = NULL; } } } So maybe we can solve it even more elegant by omiting the first 2 occurences and directly check the type and flags in ref_transaction_commit. Maybe this makes sense to go on top of that series? Thanks, Stefan refs.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/refs.c b/refs.c index 3fcf342..ae24502 100644 --- a/refs.c +++ b/refs.c @@ -12,7 +12,6 @@ struct ref_lock { struct lock_file *lk; unsigned char old_sha1[20]; int lock_fd; - int force_write; }; /* @@ -2319,8 +2318,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, lock->ref_name = xstrdup(refname); lock->orig_ref_name = xstrdup(orig_refname); ref_file = git_path("%s", refname); - if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) - lock->force_write = 1; retry: switch (safe_create_leading_directories(ref_file)) { @@ -3788,8 +3785,10 @@ int ref_transaction_commit(struct ref_transaction *transaction, struct ref_update *update = updates[i]; if (!is_null_sha1(update->new_sha1)) { - if (!update->lock->force_write && - !hashcmp(update->lock->old_sha1, update->new_sha1)) { + /* Ignore symbolic links when told not to dereference */ + if (!((update->type & REF_ISSYMREF) + && (update->flags & REF_NODEREF)) + && !hashcmp(update->lock->old_sha1, update->new_sha1)) { unlock_ref(update->lock); update->lock = NULL; } else if (write_ref_sha1(update->lock, update->new_sha1, -- 2.2.1.62.g3f15098 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html