diff --git a/integrations/gitea-repositories-meta/user2/repo20.git/hooks/post-receive b/integrations/gitea-repositories-meta/user2/repo20.git/hooks/post-receive
index 1733c16a37..f1f2709ddd 100755
--- a/integrations/gitea-repositories-meta/user2/repo20.git/hooks/post-receive
+++ b/integrations/gitea-repositories-meta/user2/repo20.git/hooks/post-receive
@@ -5,7 +5,7 @@ hookname=$(basename $0)
 GIT_DIR=${GIT_DIR:-$(dirname $0)}
 
 for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
-test -x "${hook}" || continue
+test -x "${hook}" && test -f "${hook}" || continue
 echo "${data}" | "${hook}"
 exitcodes="${exitcodes} $?"
 done
diff --git a/integrations/gitea-repositories-meta/user2/repo20.git/hooks/pre-receive b/integrations/gitea-repositories-meta/user2/repo20.git/hooks/pre-receive
index 1733c16a37..f1f2709ddd 100755
--- a/integrations/gitea-repositories-meta/user2/repo20.git/hooks/pre-receive
+++ b/integrations/gitea-repositories-meta/user2/repo20.git/hooks/pre-receive
@@ -5,7 +5,7 @@ hookname=$(basename $0)
 GIT_DIR=${GIT_DIR:-$(dirname $0)}
 
 for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
-test -x "${hook}" || continue
+test -x "${hook}" && test -f "${hook}" || continue
 echo "${data}" | "${hook}"
 exitcodes="${exitcodes} $?"
 done
diff --git a/integrations/gitea-repositories-meta/user2/repo20.git/hooks/update b/integrations/gitea-repositories-meta/user2/repo20.git/hooks/update
index 2918ffb7eb..df5bd27f10 100755
--- a/integrations/gitea-repositories-meta/user2/repo20.git/hooks/update
+++ b/integrations/gitea-repositories-meta/user2/repo20.git/hooks/update
@@ -4,7 +4,7 @@ hookname=$(basename $0)
 GIT_DIR=${GIT_DIR:-$(dirname $0)}
 
 for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
-test -x "${hook}" || continue
+test -x "${hook}" && test -f "${hook}" || continue
 "${hook}" $1 $2 $3
 exitcodes="${exitcodes} $?"
 done
diff --git a/integrations/gitea-repositories-meta/user27/template1.git/hooks/post-receive b/integrations/gitea-repositories-meta/user27/template1.git/hooks/post-receive
index 1733c16a37..f1f2709ddd 100644
--- a/integrations/gitea-repositories-meta/user27/template1.git/hooks/post-receive
+++ b/integrations/gitea-repositories-meta/user27/template1.git/hooks/post-receive
@@ -5,7 +5,7 @@ hookname=$(basename $0)
 GIT_DIR=${GIT_DIR:-$(dirname $0)}
 
 for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
-test -x "${hook}" || continue
+test -x "${hook}" && test -f "${hook}" || continue
 echo "${data}" | "${hook}"
 exitcodes="${exitcodes} $?"
 done
diff --git a/integrations/gitea-repositories-meta/user27/template1.git/hooks/pre-receive b/integrations/gitea-repositories-meta/user27/template1.git/hooks/pre-receive
index 1733c16a37..f1f2709ddd 100644
--- a/integrations/gitea-repositories-meta/user27/template1.git/hooks/pre-receive
+++ b/integrations/gitea-repositories-meta/user27/template1.git/hooks/pre-receive
@@ -5,7 +5,7 @@ hookname=$(basename $0)
 GIT_DIR=${GIT_DIR:-$(dirname $0)}
 
 for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
-test -x "${hook}" || continue
+test -x "${hook}" && test -f "${hook}" || continue
 echo "${data}" | "${hook}"
 exitcodes="${exitcodes} $?"
 done
diff --git a/integrations/gitea-repositories-meta/user27/template1.git/hooks/update b/integrations/gitea-repositories-meta/user27/template1.git/hooks/update
index 2918ffb7eb..df5bd27f10 100644
--- a/integrations/gitea-repositories-meta/user27/template1.git/hooks/update
+++ b/integrations/gitea-repositories-meta/user27/template1.git/hooks/update
@@ -4,7 +4,7 @@ hookname=$(basename $0)
 GIT_DIR=${GIT_DIR:-$(dirname $0)}
 
 for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
-test -x "${hook}" || continue
+test -x "${hook}" && test -f "${hook}" || continue
 "${hook}" $1 $2 $3
 exitcodes="${exitcodes} $?"
 done
diff --git a/modules/repository/hooks.go b/modules/repository/hooks.go
index 60e3418571..404c897715 100644
--- a/modules/repository/hooks.go
+++ b/modules/repository/hooks.go
@@ -29,9 +29,9 @@ func createDelegateHooks(repoPath string) (err error) {
 	var (
 		hookNames = []string{"pre-receive", "update", "post-receive"}
 		hookTpls  = []string{
-			fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType),
-			fmt.Sprintf("#!/usr/bin/env %s\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\n\"${hook}\" $1 $2 $3\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType),
-			fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType),
+			fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" && test -f \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType),
+			fmt.Sprintf("#!/usr/bin/env %s\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" && test -f \"${hook}\" || continue\n\"${hook}\" $1 $2 $3\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType),
+			fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" && test -f \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType),
 		}
 		giteaHookTpls = []string{
 			fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' pre-receive\n", setting.ScriptType, setting.AppPath, setting.CustomConf),