如何防止开发人员推进特定分支?

时间:2016-04-28 08:16:14

标签: git

我们最近将feature名称从foo更改为bar。这是在最新master状态下创建新分支的好机会,工作将继续进行。

上一个分支需要保留其历史记录,我无法删除。

因此,我想找到一种机制,防止混淆的开发人员在错误的分支上推送更改。我的诀窍是:

$ git checkout feature/foo
$ git commit --allow-empty -m "WARNING: DO NOT COMMIT on this branch"
$ git push

不幸的是我更喜欢像

这样的解决方案
$ git branch --lock feature/foo -m "Use feature/bar instead"
$ git push  

我还可以使用其他选项吗?

注意:我也可以重命名当前分支git branch -m feature/foo feature/bar,但这不是主题。

2 个答案:

答案 0 :(得分:1)

这是预先接收和更新挂钩的设计目的。

在服务器上建立这样的挂钩需要访问服务器。您没有提到这是您自己的服务器,还是某些“git as a service”(GaaS?)提供商。提供者总是有自己的私有方法来建立钩子,因为出于安全原因,它们不能让你完全访问服务器。

如果它是您自己的私人服务器,请以您喜欢的任何语言创建一个钩子。检查传入引用更改(pre-receive)或请求的引用更改(update)是否适用于分支feature/foo。如果是这样,请为用户打印错误消息:此错误将被复制到他们的计算机上,前缀为remote:

#! /bin/sh
status=0
while read oldsha newsha refname; do
    case $refname in
    refs/heads/feature/foo)
        echo "branch feature/foo is deprecated, use feature/bar" 1>&2
        status=1
        ;;
    esac
done
exit $status

(示例pre-receive挂钩)。

请注意,使用预接收挂钩,拒绝将拒绝整个推送,即,如果我尝试同时推送feature/foopersonal/blah,我会看到:

remote: branch feature/foo is deprecated, use feature/bar

我的推送失败,personal/blah也没有更新。

使用update挂钩,我的推送会失败并且成功一半:我会看到相同的错误消息并且feature/foo不会被推送,但是personal/blah会。 / p>

答案 1 :(得分:1)

这听起来像是你想要使用git hooks的东西。 pre-push hook可以很容易地指定这样的限制。

.git/hooks文件夹中,创建一个名为pre-push的脚本。内容应该是一个Bash脚本,如果你想阻止推送,它返回1。我对它的第一个想法是这样的:

#!/bin/bash
locked_branch='feature/foo'
push_branch=$(git rev-parse --abbrev-ref HEAD)

if [ "$locked_branch" = "$push_branch" ]
then
    echo "Do not push this branch! Use feature/bar instead"
    exit 1
fi
exit 0

编辑:

上述情况当然是因为没有适当的服务器可以运行挂钩。但是,在存在服务器的情况下,它应该是服务器端强制执行此操作的update脚本,其第一个参数是要更新的分支。所以它适用于像

这样的支票
if [ "$locked_branch" = "$1" ]

而不是基于发布的第一个脚本的push_branch变量。