限制推送到某个分支的某些遥控器

时间:2017-05-24 08:04:10

标签: git branch git-remote

我有两个遥控器,一个用于制作,一个用于GitHub。由于我必须将某些文件推送到不能放在GitHub上的作品,我想限制一个分支以避免发生意外。

有没有办法告诉我的git客户端从不推送分支"部署"远程" github"并且只将这个分支推到"生产"?

2 个答案:

答案 0 :(得分:4)

Git Hooks是您正在寻找的。您可以设置一个服务器端预接收挂钩,适用于每个尝试推送到您的仓库的人,接受或拒绝推送,具体取决于当前分支或类似的本地预推钩。可以找到后者的示例herehere

答案 1 :(得分:2)

kowsky's answer是正确的,只要您的Git至少为1.8.2(如果不是,则应升级:-))。但是,链接的示例有问题。

使用两个参数调用pre-push hook,提供:

  • 遥控器的名称,如果使用命名的遥控器,则使用URL
  • URL(扩展指定的远程的结果,如果使用了命名的远程)

什么是被推送,这是您在运行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来禁用你的钩子。