我有两个遥控器,一个用于制作,一个用于GitHub。由于我必须将某些文件推送到不能放在GitHub上的作品,我想限制一个分支以避免发生意外。
有没有办法告诉我的git客户端从不推送分支"部署"远程" github"并且只将这个分支推到"生产"?
答案 0 :(得分:4)
答案 1 :(得分:2)
kowsky's answer是正确的,只要您的Git至少为1.8.2(如果不是,则应升级:-))。但是,链接的示例有问题。
使用两个参数调用pre-push hook,提供:
什么是被推送,这是您在运行git push
时指定的内容,是在其标准输入上的钩子中提供的。这是两个相关的例子都被打破的地方。
如果你跑:
git push github refspec1 refspec2 ... refspecN
然后推送的引用是在此命令行上给出的引用。
如果你跑:
git push github
(没有refspecs),要推送的分支集合是......好吧,它很复杂,但在现代 Git中,它默认为当前分支。
示例预推钩假定 仅当前分支将被推送。由于这是现代默认设置,因此样本可能会起作用,直到您意外运行:
git push github deploy
(虽然在,master
),然后他们不会,你可能会伤心。 : - )
要修复它们,请使用读取的githook,例如:
#! /bin/sh
[ "$1" = github ] || exit 0 # allow if not pushing to github
while read lref lhash rref rhash; do
case "$lref" in
refs/heads/deploy)
echo "error: attempt to push 'deploy' branch to github" 1>&2
exit 1;;
esac
done
这将允许:
git push github master:deploy
(在远程deploy
上创建或更新github
,但使用本地分支master
,而不是本地分支{ {1}})同时禁止:
deploy
(将 local git push github deploy:oops
推送到名为deploy
的分支。
如果您希望有更复杂的规则,请将其写下来。请注意,如果您想阻止使用oops
绕过自己的挂钩,可以检查git push https://github.com/...
以及$2
。当然,如果你决定绕过自己的钩子,你可以轻松地运行$1
来禁用你的钩子。