diff --git a/refs/files-backend.c b/refs/files-backend.c index bf6f89b1d1938b6fae0c4125839c188b0d65fc86..00128f2183251e4b1170a8ce41b3d850202fb741 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -2760,6 +2760,8 @@ static void files_transaction_cleanup(struct files_ref_store *refs, if (lock) { unlock_ref(lock); + try_remove_empty_parents(refs, update->refname, + REMOVE_EMPTY_PARENTS_REF); update->backend_data = NULL; } } diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index e373d9108b651a0c7622a58aab515f212a06043b..c9893f65464f3b2a6585ed06c16beeed6a6a431b 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -2304,4 +2304,23 @@ test_expect_success 'update-ref should also create reflog for HEAD' ' test_cmp expect actual ' +test_expect_success REFFILES 'empty directories are pruned when aborting a transaction' ' + test_path_is_missing .git/refs/heads/nested && + git update-ref --stdin <<-EOF && + create refs/heads/nested/something HEAD + prepare + abort + EOF + test_path_is_missing .git/refs/heads/nested +' + +test_expect_success REFFILES 'empty directories are pruned when not committing' ' + test_path_is_missing .git/refs/heads/nested && + git update-ref --stdin <<-EOF && + create refs/heads/nested/something HEAD + prepare + EOF + test_path_is_missing .git/refs/heads/nested +' + test_done