我们最近将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
,但这不是主题。
答案 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/foo
和personal/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
变量。