Git合并前触发钩子问题:pre-merge-commit未生效求助
Git合并前钩子未触发的问题排查与解决
先排查钩子本身的基础问题
- 确认钩子文件路径与名称:必须是仓库根目录下的
.git/hooks/pre-merge-commit,不能带.sample后缀(Git默认的钩子模板是带.sample的,需要手动去掉后缀并写入你的代码)。 - 检查文件可执行权限:运行以下命令赋予脚本执行权限,Git不会运行无执行权限的钩子:
chmod +x .git/hooks/pre-merge-commit
理解pre-merge-commit的触发限制
pre-merge-commit钩子仅在合并操作会生成新的合并提交时触发——也就是当合并不是「快进(fast-forward)」模式的时候。
默认情况下,如果当前分支(比如main)的提交历史是要合并分支(比如dev)的祖先,Git会执行快进合并:直接将main分支的HEAD指针移动到dev的最新提交,不会生成新的合并提交,因此pre-merge-commit不会被触发。
你可以通过强制非快进合并验证钩子是否正常工作:
git merge dev --no-ff
此时Git会生成合并提交,你的钩子应该会输出预设的内容。
实现所有合并场景(含快进)的前置触发
如果需要在**所有合并操作前(包括快进合并)**都执行自定义逻辑,pre-merge-commit无法满足(因为快进合并没有提交环节),可以选择以下两种方案:
方案一:强制禁用快进合并
让Git在合并时默认创建合并提交,确保pre-merge-commit每次都触发:
# 仅对当前仓库生效 git config merge.ff false # 对所有本地仓库全局生效 git config --global merge.ff false
方案二:自定义合并命令
创建一个自定义Git命令,替代原生的git merge,在合并前先执行你的前置逻辑:
- 创建脚本文件
git-mymerge,内容如下:#!/bin/bash # 这里写你的合并前逻辑 echo "Pre-merge hook triggered" # 执行原生合并命令,传递所有参数 git merge "$@" - 赋予脚本执行权限:
chmod +x git-mymerge - 将脚本放到系统PATH路径下(比如
/usr/local/bin/),之后用git mymerge dev代替git merge dev,无论快进还是非快进合并,都会先执行你的前置逻辑。
内容的提问来源于stack exchange,提问作者Lord Tesla
相关产品推荐
相关产品推荐

