如何在pre-merge-commit钩子中获取MERGE_HEAD哈希值?
在pre-merge-commit钩子中获取合并头哈希的方法
方法一:直接读取MERGE_HEAD(推荐)
pre-merge-commit钩子本应在合并提交创建前触发,此时.git/MERGE_HEAD文件尚未被删除,你可以直接通过Git命令读取合并头哈希:
merge_head=$(git rev-parse MERGE_HEAD)
如果该命令执行失败,可能是Git版本过低(建议升级到2.24及以上版本),或者你的合并流程中MERGE_HEAD被提前清理,可尝试以下替代方法。
方法二:从MERGE_MSG文件提取信息
Git在合并过程中会将合并描述写入.git/MERGE_MSG文件,你可以从中提取合并目标的分支名或提交哈希,再转换为完整哈希:
# 读取MERGE_MSG内容 merge_msg=$(cat .git/MERGE_MSG) # 匹配合并分支的场景(如 "Merge branch 'feature' into main") if [[ $merge_msg =~ Merge branch \'([^\']+)\' ]]; then merge_head=$(git rev-parse "${BASH_REMATCH[1]}") # 匹配合并单个提交的场景(如 "Merge commit 'a1b2c3d' into main") elif [[ $merge_msg =~ Merge commit \'([0-9a-f]+)\' ]]; then merge_head="${BASH_REMATCH[1]}" # 匹配合并标签的场景(如 "Merge tag 'v1.0' into main") elif [[ $merge_msg =~ Merge tag \'([^\']+)\' ]]; then merge_head=$(git rev-parse "${BASH_REMATCH[1]}") else echo "无法识别合并目标格式" >&2 exit 1 fi # 输出合并头哈希 echo "合并头哈希:$merge_head"
这种方法依赖MERGE_MSG的默认格式,在大多数标准合并场景下有效。
注意事项
- pre-merge-commit仅在非快进合并时触发,快进合并不会执行该钩子,无需处理此类情况。
- 确保钩子脚本拥有读取
.git目录下文件的权限。
内容的提问来源于stack exchange,提问作者Piotr Siupa
相关产品推荐
相关产品推荐

