如何防止开发人员推动特定分支?
我们最近将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
,但这是一个关闭主题。
这是预接收和更新挂钩的设计目的。
在服务器上建立这样的挂钩需要访问服务器。你不提这是你自己的服务器,还是一些“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/foo
和personal/blah
,我会看到:
remote: branch feature/foo is deprecated, use feature/bar
和我的推动力量失败,personal/blah
也未更新。
使用一个update
钩,我就推半失败,半成功:我会看到相同的错误消息,并且feature/foo
不会得到推,但personal/blah
会。
这听起来像你会想要使用git挂钩。 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
变量的基础上,发布的第一个脚本。
'上一个分支需要保留其历史记录,我不能删除。“您可以删除分支,并创建一个同名的标签。 – AD7six
哦!这是一个非常好的点 – nowox
使用标签是一个相当不错的把戏。不过请注意,旧版本的git(最高约为1.8.something)允许推送快进标签,即将它们与分支完全相同。 (尽管你不能像分支一样检查它们,所以你在那里获得了一些安全性。) – torek