Git 限制dev分之合并到其他分支

686 阅读1分钟

写这篇文章的目的

在实际开发过程中,经常会遇到大家共用一个 dev 分支,但是 dev 分支仅仅是用于开发使用的一个分支,里面有太多已废弃的提交。所以我们要防止 dev 分支被合并到其他分支。

利用 git 的 hooks 钩子

在merge过程中会依次触发prepare-commit-msg和commit-msg钩子

将 git/hooks/ 下的 prepare-commit-msg.sample 文件更名为prepare-commit-msg

#!/bin/sh
echo "执行的hook文件: prepare-commit-msg"

# 钩子的路径
echo "钩子文件的路径: " $0

# 提交信息文件路径
echo "提交信息的文件路径: " $1

# 操作类型
echo "操作类型: " $2

## 被限制分支名称
BLACKLIST=("dev" "dev1")
## 记录被限制分支的 commit
black_commit_list=()

if [[ -e .git/MERGE_HEAD ]]; then
	# heads=`ls .git/refs/heads`
	for bl in "${BLACKLIST[@]}"; do
		if [[ -e .git/refs/heads/${bl} ]]; then
			black_commit_list+=(`cat .git/refs/heads/${bl}`)
		fi
	done

	# 要被合并的commitId
	merge_head=`cat .git/MERGE_HEAD`
	for br in "${black_commit_list[@]}"; do
		if [[ ${merge_head} == ${br} ]]; then
			echo "\033[41;37m 合并了黑名单中的分支 \033[0m\n\r"
			echo "\033[41;37m 请执行 git merge --abort 命令恢复到合并前 \033[0m"
			exit 1
		fi
	done
fi	

注意点

  • fastward 合并模式无法触发任何钩子,所以必须使用强制产生新版本的 --no-ff 模式,钩子才能发挥作用。推荐做法是使用git别名,以后合并操作使用git mg xxx, 保证钩子执行的同时还能少按几次键。
git config --global alias.mg 'merge --no-ff',