git 禁止dev合并到任何其他分支
·
创建 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
更多推荐
所有评论(0)