创建 pre-merge-commit 钩子

导航到 Git 仓库的钩子目录:

cd /path/to/your/repo/.git/hooks

创建或编辑 pre-merge-commit 钩子:
在这里插入图片描述
也可以通过指令创建

nano pre-merge-commit

在钩子文件中添加以下代码:

#!/bin/sh

# 获取当前分支名称
current_branch=$(git symbolic-ref --short HEAD)

# 获取即将合并的分支名称
merging_branch=$(git rev-parse --abbrev-ref MERGE_HEAD)

# 检查是否正在尝试将 dev 分支合并到其他分支
if [ "$merging_branch" = "dev" ]; then
  echo "Error: Merging the 'dev' branch into any other branch is not allowed."
  exit 1
fi

# 允许合并继续
exit 0

使钩子脚本可执行:

chmod +x pre-merge-commit

测试 pre-merge-commit 钩子

尝试将 dev 分支合并到其他分支:

git checkout other-branch
git merge dev

预期结果:合并操作会被中止,并显示错误信息:

Error: Merging the 'dev' branch into any other branch is not allowed.

尝试将其他分支合并到当前分支:

git merge feature-branch

预期结果:合并操作应该成功进行。

补充说明

上述 pre-merge-commit 钩子只在生成合并提交前运行,因此如果 dev 分支的合并是快速合并(fast-forward merge),钩子不会被触发。为确保所有合并操作都被检查,可以同时创建 pre-merge 钩子来处理快速合并的情况:和上面操作一样,不过是从pre-merge-commit换成了pre-merge钩子

2024-09-06更新
以上好像不太好使,现在换成另一种发法实现

另外一个方法,可以撤销合并,但是如果合并中存在冲突无法执行这个hooks
在这里插入图片描述

#!/usr/bin/env sh

# 当前分支的名称
CURRENT_BRANCH_NAME=$(git branch --show-current)

# 禁止合并的分支
FORBIDDEN_BRANCH_NAME="dev"

    if [[ "$GIT_REFLOG_ACTION" == *"$FORBIDDEN_BRANCH_NAME"* ]]; then
        echo "检测到非法合并: ${GIT_REFLOG_ACTION//merge / } ==into==> $CURRENT_BRANCH_NAME"
        echo "撤销合并中..."
        $(git reset --merge HEAD@{1})
        echo "已撤销合并 done"
        exit 1
    fi

所以再写一个禁止推送hook
在这里插入图片描述

#!/bin/sh


# 当前分支的名称
CURRENT_BRANCH_NAME=$(git branch --show-current)

if [ "$CURRENT_BRANCH_NAME" == "dev" ]; then
exit 0
fi

while read local_ref local_sha remote_ref remote_sha
do
    # 检查新提交的范围内是否包含来自 dev 分支的提交
    if git rev-list $local_sha | grep -q $(git rev-parse refs/heads/dev); then
        echo "禁止将 dev 分支合并到任何其他分支"
        exit 1
    fi
done

exit 0

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐