From: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> git-pack-refs 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 | 6 +++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/refs/files-backend.c b/refs/files-backend.c index 957ebe08c0..3be317d524 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 eef7489b5b..7f8fd012e8 100755 --- a/t/t1416-ref-transaction-hooks.sh +++ b/t/t1416-ref-transaction-hooks.sh @@ -358,7 +358,7 @@ test_expect_success "update-ref: update HEAD, a symbolic-ref" ' test_cmp_heads_and_tags -C workdir expect ' -test_expect_failure "update-ref: call git-pack-refs to create packed_ref_store" ' +test_expect_success "update-ref: call git-pack-refs to create packed_ref_store" ' test_when_finished "rm -f $HOOK_OUTPUT" && git -C workdir pack-refs --all && test_path_is_file workdir/.git/packed-refs && @@ -632,7 +632,7 @@ test_expect_success "branch: create new branches" ' test_cmp_heads_and_tags -C workdir expect ' -test_expect_failure "branch: call git-gc to create packed_ref_store" ' +test_expect_success "branch: call git-gc to create packed_ref_store" ' test_when_finished "rm -f $HOOK_OUTPUT" && git -C workdir gc && test_path_is_file workdir/.git/packed-refs && @@ -835,7 +835,7 @@ test_expect_success "tag: create new tags" ' test_cmp_heads_and_tags -C workdir expect ' -test_expect_failure "tag: call git-pack-refs to create packed_ref_store" ' +test_expect_success "tag: call git-pack-refs to create packed_ref_store" ' 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