2016-04-28 77 views
1

我们最近将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

'上一个分支需要保留其历史记录,我不能删除。“您可以删除分支,并创建一个同名的标签。 – AD7six

+0

哦!这是一个非常好的点 – nowox

+0

使用标签是一个相当不错的把戏。不过请注意,旧版本的git(最高约为1.8.something)允许推送快进标签,即将它们与分支完全相同。 (尽管你不能像分支一样检查它们,所以你在那里获得了一些安全性。) – torek

回答

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会。

+0

诅咒它,我会提到这一点:我们不使用任何服务器,而是在网络上的某处裸露存储库。 (需要很长时间才能说服我们的管理层,Git服务器可能对某些事情有用) – nowox

+0

但这是一个很好的解决方案。 – nowox

+1

“网络上某处裸露的存储库”=“某处”是您的服务器! (虽然如果它只是作为一个文件系统或网络驱动器呈现,那么你有点卡住了 - 推动不会调用钩子。) – torek

1

这听起来像你会想要使用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变量的基础上,发布的第一个脚本。

+1

使用预先推送钩子的问题是,您必须说服每个用户安装这样的钩子。这*比说服每个用户长时间记住不要推送到指定的分支更好,而且不像服务器那样防止意外,所以用户不能把它搞砸。 – torek

+0

@torek一个服务器端更新钩应该更好,我正在编辑该信息,但在这个问题中的约束是,回购只是躺在fie系统上,据我了解。 – DUman

相关问题