From 824e1bac7de365708e92e22b5aa2624e6bf7bd9e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 12 Apr 2017 11:24:41 -0700 Subject: [PATCH v2] Allow bypassing of some checks when merging * build-aux/git-hooks/pre-commit: Don't check merged in changes unless GIT_MERGE_CAREFULLY is true. * admin/notes/repo: Explain how to use GIT_MERGE_CAREFULLY. --- admin/notes/repo | 7 +++++++ build-aux/git-hooks/pre-commit | 22 +++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/admin/notes/repo b/admin/notes/repo index 3ab3da7807..2416563f83 100644 --- a/admin/notes/repo +++ b/admin/notes/repo @@ -76,6 +76,13 @@ conflict by choosing either the master or branch version, then run 'make -C lisp autoloads' to update the md5sums to the correct master value before committing. +* Running git commit hooks on merged changes + +Normally git does not run the pre-commit hook on merged changes. In +order to run the hooks on the branch being merged in, set the +environment variable GIT_MERGE_CAREFULLY to 'true', and the +'--no-commit' option to the 'git merge' call. + * Re-adding a file that has been removed from the repository Let's suppose you've done: diff --git a/build-aux/git-hooks/pre-commit b/build-aux/git-hooks/pre-commit index 6483bfc6b3..59bff79df1 100755 --- a/build-aux/git-hooks/pre-commit +++ b/build-aux/git-hooks/pre-commit @@ -25,16 +25,32 @@ LC_ALL= . git-sh-setup +# Unless GIT_MERGE_CAREFULLY is 'true', then when doing a two-way merge, +# ignore problems that came from the other side of the merge. +head=HEAD +if test -e "$GIT_DIR"/MERGE_HEAD && test "$GIT_MERGE_CAREFULLY" != true; then + merge_heads=`cat "$GIT_DIR"/MERGE_HEAD` || exit + for merge_head in $merge_heads; do + case $head in + HEAD) head=$merge_head;; + # For multi-head merges, there's no easy way to ignore merged in + # changes. But if you're doing multi-head merges, presumably + # you know how to handle any ensuing problems. + *) head=HEAD; break;; + esac + done +fi + git_diff='git diff --cached --name-only --diff-filter=A' ok_chars='\0+[=-=]./0-9A-Z_a-z' -nbadchars=`$git_diff -z HEAD | tr -d "$ok_chars" | wc -c` +nbadchars=`$git_diff -z $head | tr -d "$ok_chars" | wc -c` if test "$nbadchars" -ne 0; then echo "File name does not consist of -+./_ or ASCII letters or digits." exit 1 fi -for new_name in `$git_diff HEAD`; do +for new_name in `$git_diff $head`; do case $new_name in -* | */-*) echo "$new_name: File name component begins with '-'." @@ -53,4 +69,4 @@ nbadchars= # tests so that trailing spaces are generated on the fly rather than # being committed as source. -exec git diff-index --check --cached HEAD -- +exec git diff-index --check --cached $head -- -- 2.11.1