如何仅用Git实现:功能分支含指定内容时禁止合入master
需求实现方案
你的需求完全可以实现,仅通过Git自带的内置能力即可完成,不需要借助任何第三方脚本或工具。
核心实现原理
使用Git 2.24及以上版本自带的pre-merge-commit钩子,该钩子会在merge操作生成提交前触发,仅针对合并到master分支的场景做校验,不会影响功能分支的正常提交。
配置步骤
- 进入本地仓库的钩子目录:
.git/hooks - 将目录内的示例钩子文件
pre-merge-commit.sample重命名为pre-merge-commit(删除.sample后缀即可) - 为钩子文件添加执行权限(Linux/macOS执行
chmod +x pre-merge-commit,Windows环境无需额外操作) - 编辑
pre-merge-commit文件,替换为以下内容:
#!/bin/sh # 仅对合并到master分支的操作做校验 current_branch=$(git rev-parse --abbrev-ref HEAD) if [ "$current_branch" != "master" ]; then exit 0 fi # 检查待合并的内容中是否包含//TODO关键词,可自行添加其他需要拦截的规则 if git diff --cached | grep -q "//TODO"; then echo "错误:待合入master的内容包含未清理的//TODO注释,请清理后再执行合并" exit 1 fi exit 0
适配性说明
- 你使用的
git merge --squash工作流完全适配该钩子:squash操作执行时会触发该钩子,校验的是squash后待提交到master的最终内容,不会拦截你在功能分支提交带TODO的代码 - 所有校验逻辑使用的都是Git和系统自带的基础命令,无需安装任何第三方工具
- 如果需要拦截其他指定内容,只需修改
grep匹配的规则即可 - 若你使用的Git版本低于2.24不支持
pre-merge-commit钩子,也可以替换为Git自带的pre-commit钩子,逻辑和上述代码完全一致,仅在当前分支为master时校验提交内容,同样不会影响功能分支的正常提交
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

