Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Gitlab中是否可以对所有分支禁用强制推送,但允许删除它们?_Gitlab - Fatal编程技术网

在Gitlab中是否可以对所有分支禁用强制推送,但允许删除它们?

在Gitlab中是否可以对所有分支禁用强制推送,但允许删除它们?,gitlab,Gitlab,我们使用GitLab,希望为开发人员禁用强制推送和重基,但我们也希望他们能够合并和删除分支,受保护的分支除外。我们希望将这些规则推广到我们的所有GitLab项目(大约有130个)和所有分支。可能吗 我们尝试使用受保护的分支-除了受保护的master之外,我们还将所有分支标记为受保护的(通配符*),并允许开发人员推送和合并,但受保护的分支也被禁止删除(即使在接受合并请求时),因此它对我们不起作用。希望有人能提出任何可行的解决方案。我找到的唯一解决方案是创建全局自定义挂钩(根据和)。因此,我创建了可

我们使用GitLab,希望为开发人员禁用强制推送和重基,但我们也希望他们能够合并和删除分支,受保护的分支除外。我们希望将这些规则推广到我们的所有GitLab项目(大约有130个)和所有分支。可能吗


我们尝试使用受保护的分支-除了受保护的
master
之外,我们还将所有分支标记为受保护的(通配符
*
),并允许开发人员推送和合并,但受保护的分支也被禁止删除(即使在接受合并请求时),因此它对我们不起作用。希望有人能提出任何可行的解决方案。

我找到的唯一解决方案是创建全局自定义挂钩(根据和)。因此,我创建了可执行文件
gitlab shell/hooks/pre-receive.d/disable-force-push.sh
,包含以下内容:

#!/bin/sh
# <oldrev> <newrev> <refname>
# update a blame tree

while read oldrev newrev ref ; do
    # old revision is blank - branch creation
    if [ "$oldrev" = "0000000000000000000000000000000000000000" ] || 
         # new revision is blank - branch deletion
         [ "$newrev" = "0000000000000000000000000000000000000000" ] ;
    then
        # create new or delete old branch
        continue;
    fi

    base=$(git merge-base $oldrev $newrev);
    if [ "$base" != "$oldrev" ] ; then
        # non fast forward merge
        echo "Force pushing of $ref is forbidden";
        exit 1;
    fi
done
exit 0;
#/垃圾箱/垃圾箱
#   
#更新责备树
读取oldrev-newrev-ref时;做
#旧版本为空-创建分支
如果[“$oldrev”=“0000000000000000000000000000000000”]|
#新修订为空-分支删除
[“$newrev”=“0000000000000000000000000000”];
然后
#创建新分支或删除旧分支
继续;
fi
基数=$(git合并基数$oldrev$newrev);
如果[“$base”!=“$oldrev”];然后
#非快进合并
echo“禁止强行推送$ref”;
出口1;
fi
完成
出口0;

不太确定是否有一个简单的解决方案,但这值得一看:@ninge,是的,我读过这一页。但正如我从中看到的,强制推送和删除分支的权限是相同的(对于受保护和非受保护的分支)。我没有找到任何方法来改变它。我错过什么了吗?