From: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> The git-pack-refs command will call "files_pack_refs()" to pack loose references into the "packed-refs" file, and there are no real changes to the repository. Therefore, by initializing a transaction with an empty "hook_flags" field, the "reference-transaction" hook will not run. The "prune_refs()" and "prune_ref()" functions are called from "file_pack_refs()", and they are used to prune loose refereces which have already been packed into "packed-refs". The transaction instance in "prune_ref()" should also be initialized with an empty "hook_flags" field. The behavior of the following git commands and three testcases have been fixed in t1416: * git gc * git pack-refs Signed-off-by: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> --- refs/files-backend.c | 10 ++++++++-- t/t1416-ref-transaction-hooks.sh | 12 +++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/refs/files-backend.c b/refs/files-backend.c index 7c1c25a25c..f0947c9dca 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1136,7 +1136,8 @@ static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r) if (check_refname_format(r->name, 0)) return; - transaction = ref_store_transaction_begin(&refs->base, &err); + /* Called by "files_pack_refs()" and should not run any hooks. */ + transaction = ref_store_transaction_begin_extended(&refs->base, 0, &err); if (!transaction) goto cleanup; ref_transaction_add_update( @@ -1207,7 +1208,12 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags) struct strbuf err = STRBUF_INIT; struct ref_transaction *transaction; - transaction = ref_store_transaction_begin(refs->packed_ref_store, &err); + /* + * No real changes have occurred to the repository and no hooks + * should be run for this transaction. + */ + transaction = ref_store_transaction_begin_extended(refs->packed_ref_store, + 0, &err); if (!transaction) return -1; diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh index 1ae601a73d..b7ffc9415b 100755 --- a/t/t1416-ref-transaction-hooks.sh +++ b/t/t1416-ref-transaction-hooks.sh @@ -392,9 +392,7 @@ test_expect_success "update-ref: update HEAD" ' test_cmp_heads_and_tags -C workdir expect ' -# Failed because the reference-transaction hook was executed even -# though no refs were changed by running git-pack-refs. -test_expect_failure "update-ref: prepare packed_ref_store using pack-refs" ' +test_expect_success "update-ref: prepare packed_ref_store using pack-refs" ' test_when_finished "rm -f $HOOK_OUTPUT" && git -C workdir pack-refs --all && test_path_is_file workdir/.git/packed-refs && @@ -737,9 +735,7 @@ test_expect_success "branch: create new branches" ' test_cmp_heads_and_tags -C workdir expect ' -# Failed because the reference-transaction hook was executed even -# though no refs were changed by running git-gc. -test_expect_failure "branch: prepare packed_ref_store using gc" ' +test_expect_success "branch: prepare packed_ref_store using gc" ' test_when_finished "rm -f $HOOK_OUTPUT" && git -C workdir gc && test_path_is_file workdir/.git/packed-refs && @@ -1014,9 +1010,7 @@ test_expect_success "tag: create new tags" ' test_cmp_heads_and_tags -C workdir expect ' -# Failed because the reference-transaction hook was executed even -# though no refs were changed by running git-pack-refs. -test_expect_failure "tag: prepare packed_ref_store using pack-refs" ' +test_expect_success "tag: prepare packed_ref_store using pack-refs" ' test_when_finished "rm -f $HOOK_OUTPUT" && git -C workdir pack-refs --all && test_path_is_file workdir/.git/packed-refs && -- 2.36.1.25.gc87d5ad63a.dirty