git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 4/4] merge: --no-verify to bypass pre-merge-commit hook

From
Josh Steadmon <steadmon@google.com>
Date
Aug 7, 2019, 18:57 UTC
Message-ID
<7b81e2717f739a92dea10eaf570407c742d30533.1565203880.git.steadmon@google.com>
In-Reply-To
<cover.1565203880.git.steadmon@google.com>
From: Michael J Gruber <git@drmicha.warpmail.net>

Analogous to commit, introduce a '--no-verify' option which bypasses the pre-merge-commit hook. The shorthand '-n' is taken by '--no-stat' already.

[js: * reworded commit message to reflect current state of --no-stat flag
       and new hook name
     * fixed flag documentation to reflect new hook name
     * cleaned up trailing whitespace
     * squashed test changes from the original series' patch 4/4
     * modified tests to follow pattern from this series' patch 1/4
     * added a test case for --no-verify with non-executable hook
     * when testing that the merge hook did not run, make sure we
       actually have a merge to perform (by resetting the "side" branch
       to its original state).
]
Improved-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Michael J Gruber <git@grubix.eu>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 Documentation/githooks.txt                    |  3 +-
 builtin/merge.c                               |  4 +-
 ...3-pre-commit-and-pre-merge-commit-hooks.sh | 39 +++++++++++++++++++
 3 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index d9da474fb0..57d6e2b98d 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -106,7 +106,8 @@ the use of non-ASCII filenames.
 pre-merge-commit
 ~~~~~~~~~~~~~~~~
 
-This hook is invoked by linkgit:git-merge[1]. It takes no parameters, and is
+This hook is invoked by linkgit:git-merge[1], and can be bypassed
+with the `--no-verify` option.  It takes no parameters, and is
 invoked after the merge has been carried out successfully and before
 obtaining the proposed commit log message to
 make a commit.  Exiting with a non-zero status from this script
diff --git a/builtin/merge.c b/builtin/merge.c
index bf0ae68c40..c9746e37b8 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -287,7 +287,7 @@ static struct option builtin_merge_options[] = {
 	  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
 	OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
 	OPT_BOOL(0, "signoff", &signoff, N_("add Signed-off-by:")),
-	OPT_BOOL(0, "no-verify", &no_verify, N_("bypass commit-msg hook")),
+	OPT_BOOL(0, "no-verify", &no_verify, N_("bypass pre-merge-commit and commit-msg hooks")),
 	OPT_END()
 };
 
@@ -818,7 +818,7 @@ static void prepare_to_commit(struct commit_list *remoteheads)
 	struct strbuf msg = STRBUF_INIT;
 	const char *index_file = get_index_file();
 
-	if (run_commit_hook(0 < option_edit, index_file, "pre-merge-commit", NULL))
+	if (!no_verify && run_commit_hook(0 < option_edit, index_file, "pre-merge-commit", NULL))
 		abort_commit(remoteheads, NULL);
 	/*
 	 * Re-read the index as pre-merge-commit hook could have updated it,
diff --git a/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh b/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh
index 7a5434c7ab..b3485450a2 100755
--- a/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh
+++ b/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh
@@ -84,6 +84,15 @@ test_expect_success '--no-verify with no hook' '
 	test_path_is_missing actual_hooks
 '
 
+test_expect_success '--no-verify with no hook (merge)' '
+	test_when_finished "rm -f actual_hooks" &&
+	git branch -f side side-orig &&
+	git checkout side &&
+	git merge --no-verify -m "merge master" master &&
+	git checkout master &&
+	test_path_is_missing actual_hooks
+'
+
 test_expect_success 'with succeeding hook' '
 	test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
 	cp "$HOOKDIR/success.sample" "$PRECOMMIT" &&
@@ -131,6 +140,16 @@ test_expect_success '--no-verify with succeeding hook' '
 	test_path_is_missing actual_hooks
 '
 
+test_expect_success '--no-verify with succeeding hook (merge)' '
+	test_when_finished "rm -f \"$PREMERGE\" actual_hooks" &&
+	cp "$HOOKDIR/success.sample" "$PREMERGE" &&
+	git branch -f side side-orig &&
+	git checkout side &&
+	git merge --no-verify -m "merge master" master &&
+	git checkout master &&
+	test_path_is_missing actual_hooks
+'
+
 test_expect_success 'with failing hook' '
 	test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
 	cp "$HOOKDIR/fail.sample" "$PRECOMMIT" &&
@@ -160,6 +179,16 @@ test_expect_success 'with failing hook (merge)' '
 	test_cmp expected_hooks actual_hooks
 '
 
+test_expect_success '--no-verify with failing hook (merge)' '
+	test_when_finished "rm -f \"$PREMERGE\" actual_hooks" &&
+	cp "$HOOKDIR/fail.sample" "$PREMERGE" &&
+	git branch -f side side-orig &&
+	git checkout side &&
+	git merge --no-verify -m "merge master" master &&
+	git checkout master &&
+	test_path_is_missing actual_hooks
+'
+
 test_expect_success POSIXPERM 'with non-executable hook' '
 	test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" &&
 	cp "$HOOKDIR/non-exec.sample" "$PRECOMMIT" &&
@@ -188,6 +217,16 @@ test_expect_success POSIXPERM 'with non-executable hook (merge)' '
 	test_path_is_missing actual_hooks
 '
 
+test_expect_success POSIXPERM '--no-verify with non-executable hook (merge)' '
+	test_when_finished "rm -f \"$PREMERGE\" actual_hooks" &&
+	cp "$HOOKDIR/non-exec.sample" "$PREMERGE" &&
+	git branch -f side side-orig &&
+	git checkout side &&
+	git merge --no-verify -m "merge master" master &&
+	git checkout master &&
+	test_path_is_missing actual_hooks
+'
+
 test_expect_success 'with hook requiring GIT_PREFIX' '
 	test_when_finished "rm -rf \"$PRECOMMIT\" expected_hooks actual_hooks success" &&
 	cp "$HOOKDIR/require-prefix.sample" "$PRECOMMIT" &&
-- 
2.22.0.770.g0f2c4a37fd-goog
Previous: Josh SteadmonNext: Martin Ågren
Message 58 of 59 in “pre-merge hook”
  1. 0/4 pre-merge hookMichael J Gruber, Sep 22, 2017
  2. 2/4 merge: do no-verify like commitMichael J Gruber, Sep 22, 2017
  3. Stefan BellerSep 22, 2017
  4. 1/4 git-merge: Honor pre-merge hookMichael J Gruber, Sep 22, 2017
  5. Stefan BellerSep 22, 2017
  6. Martin ÅgrenSep 23, 2017
  7. 3/4 merge: --no-verify to bypass pre-merge hookMichael J Gruber, Sep 22, 2017
  8. Junio C HamanoSep 23, 2017
  9. Michael J GruberSep 25, 2017
  10. 4/4 t7503: add tests for pre-merge-hookMichael J Gruber, Sep 22, 2017
  11. Stefan BellerSep 22, 2017
  12. Junio C HamanoOct 2, 2017
  13. Stefan BellerOct 2, 2017
  14. Junio C HamanoOct 17, 2017
  15. 0/4 pre-merge hookJosh Steadmon, Jul 18, 2019
  16. 0/4 pre-merge hookJosh Steadmon, Jul 18, 2019
  17. 1/4 git-merge: Honor pre-merge hookJosh Steadmon, Jul 18, 2019
  18. Martin ÅgrenJul 29, 2019
  19. 2/4 merge: do no-verify like commitJosh Steadmon, Jul 18, 2019
  20. 3/4 merge: --no-verify to bypass pre-merge hookJosh Steadmon, Jul 18, 2019
  21. Martin ÅgrenJul 29, 2019
  22. Josh SteadmonJul 29, 2019
  23. 4/4 t7503: add tests for pre-merge-hookJosh Steadmon, Jul 18, 2019
  24. Martin ÅgrenJul 29, 2019
  25. Josh SteadmonJul 29, 2019
  26. Martin ÅgrenJul 30, 2019
  27. Josh SteadmonJul 31, 2019
  28. Martin ÅgrenJul 29, 2019
  29. Josh SteadmonJul 29, 2019
  30. Martin ÅgrenJul 29, 2019
  31. Josh SteadmonJul 29, 2019
  32. 0/4 pre-merge-commit hookJosh Steadmon, Aug 1, 2019
  33. 1/4 t7503: verify proper hook executionJosh Steadmon, Aug 1, 2019
  34. Martin ÅgrenAug 2, 2019
  35. 2/4 merge: do no-verify like commitJosh Steadmon, Aug 1, 2019
  36. 3/4 git-merge: honor pre-merge-commit hookJosh Steadmon, Aug 1, 2019
  37. Martin ÅgrenAug 2, 2019
  38. Josh SteadmonAug 2, 2019
  39. 4/4 merge: --no-verify to bypass pre-merge-commit hookJosh Steadmon, Aug 1, 2019
  40. Martin ÅgrenAug 2, 2019
  41. 1/5 t7503: use "&&" in "test_when_finished" rather than ";"Martin Ågren, Aug 2, 2019
  42. 2/5 t7503: avoid touch when mtime doesn't matterMartin Ågren, Aug 2, 2019
  43. 5/5 t7503: test failing merge with both hooks availableMartin Ågren, Aug 2, 2019
  44. 4/5 t7503: don't create "actual_hooks" for later appendingMartin Ågren, Aug 2, 2019
  45. 3/5 t7503: simplify file-jugglingMartin Ågren, Aug 2, 2019
  46. Josh SteadmonAug 2, 2019
  47. 0/4 pre-merge-commit hookJosh Steadmon, Aug 5, 2019
  48. 1/4 t7503: verify proper hook executionJosh Steadmon, Aug 5, 2019
  49. Junio C HamanoAug 6, 2019
  50. Josh SteadmonAug 7, 2019
  51. 2/4 merge: do no-verify like commitJosh Steadmon, Aug 5, 2019
  52. 3/4 git-merge: honor pre-merge-commit hookJosh Steadmon, Aug 5, 2019
  53. 4/4 merge: --no-verify to bypass pre-merge-commit hookJosh Steadmon, Aug 5, 2019
  54. 0/4 pre-merge-commit hookJosh Steadmon, Aug 7, 2019
  55. 1/4 t7503: verify proper hook executionJosh Steadmon, Aug 7, 2019
  56. 2/4 merge: do no-verify like commitJosh Steadmon, Aug 7, 2019
  57. 3/4 git-merge: honor pre-merge-commit hookJosh Steadmon, Aug 7, 2019
  58. 4/4 merge: --no-verify to bypass pre-merge-commit hookJosh Steadmon, Aug 7, 2019
  59. Martin ÅgrenAug 8, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.