git hooks 通过 pre-merge-commit 按照策略禁止合并分支

265 天前
 simuhunluo

请教大家

在 pre-merge-commit 脚本中如何获取 git merge <branch2025> 命令中的目标分支名称?

背景

比如当前我们开发分支是 dev/202403/r1, 同一时间也可能会有需求在 dev/202404/r1 上面进行开发。开发过程中禁止将 dev/202404/r1 分支的代码合并到 dev/202403/r1 。

解决该问题的思路是获取两个分支的名称,并提取其中的日期,判断日期先后顺序进行拦截。

现在遇到的问题就是能获取到当前分支名称 dev/202403/r1 ,但是获取不到 git merge <branch>后面的目标分支名称,请教大家是否有思路可以解决呢?

曾做尝试:

  1. target_branch=cat $1 失败
  2. target_branch= $1 失败

通过$0 打印出来的内容可以看出,脚本执行其实是.git/hooks/pre-merge-commit ,在执行钩子脚本的时候 git merge 命令还会真正执行。但是理论上讲,命令已经提给 git 了,应该有什么骚操作可以拿到目标分支名称。

我的脚本代码(gpt 辅助写的)

#!/bin/bash

# 获取当前分支名称
current_branch=$(git rev-parse --abbrev-ref HEAD)

# 获取目标分支名称
target_branch=`cat $1`

# 提取分支名称中的日期
current_date=$(echo $current_branch | grep -oP '\d{8}')
echo "当前所处分支:"$current_branch", 检测到迭代日期:"$current_date
target_date=$(echo $target_branch | grep -oP '\d{8}')
echo "要合并的分支:"$target_branch", 检测到迭代日期:"$target_date

# 检查日期是否存在
if [[ -z "$current_date" ]] || [[ -z "$target_date" ]]; then
    echo "无法从分支名称中提取日期"
    exit 1
fi

# 比较日期
if [[ "$current_date" -gt "$target_date" ]]; then
    echo "禁止将大的日期合并到小的日期分支上"
    exit 1
fi

# 允许合并
exit 0
792 次点击
所在节点    git
4 条回复
julyclyde
264 天前
没明白,那到底是$1 还是,不是$1 呢?
刚开始你说$1 失败,但是后面脚本还是用的$1
simuhunluo
264 天前
@julyclyde $1 行不通。我贴的脚本是我的测试例子。
julyclyde
264 天前
@simuhunluo 哦。明白了
就是“如果有参数”那程序应该是这样,但实际上却没有这个参数

感觉没什么办法呢
leemars
245 天前
https://thomasvilhena.com/2021/11/prevent-merge-from-specific-branch-git-hook
这里提供了一个根据 GIT_REFLOG_ACTION 来判断行为的拦截思路

https://stackoverflow.com/a/74816940
这里提供了另一个在 prepare-commit-msg 中进行拦截的思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1021925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX