只允许将一个分支推送到远程

时间:2017-06-07 23:32:07

标签: git git-push git-remote

我们有一个Git遥控器(用于制作),使用OpenShift。

在本地,我想确保只能将主分支推送到此远程。我应该采取哪些特殊步骤来确保这种情况发生,或者我应该依赖Git默认值?

我99%确定生产Git遥控器只查看主分支。所以我的理解是,我们可以在本地推送不同分支的唯一方法是:

git push prod_remote a_feature_branch:master

所以我的问题是 - 有没有办法阻止我的团队成员这样做(没有强制标志)?

1 个答案:

答案 0 :(得分:1)

接收方面,正在接收提交的Git的 no notion 分支名称(如果有)附加到发送Git上的提交。它只知道它收到了一些对象,然后是更新一些引用的请求。如果这些引用拼写为refs/heads/whatever,则它们是名为 whatever 的分支的分支名称创建,删除或更新操作。

因此,在接收方面,答案是否定的:没有办法阻止任何人这样做。如果他们可以将提交交付给接收Git,他们可以提供他们喜欢的任何提交和任何参考名称更新。您可以使用留下的任何身份验证数据(例如,来自ssh或Gitolite等访问控制系统)来检查提交和/或引用名称更新,但您对 origin 一无所知,只有哈希ID和名称。

发送方面,您可以使用pre-push挂钩来执行更多操作。使用以下命令运行预推钩:

  • $1:遥控器的名称,如果推送使用命名的遥控器;
  • $2:与$1
  • 对应的网址

(如果没有使用命名的远程,两个命令行参数是相同的),并且在标准输入上,是一行,每行push refspec一行,每行有四个项目:

  • 本地参考(例如,refs/heads/branch
  • 本地哈希ID
  • 远程参考
  • 远程哈希ID

(详见the githooks documentation)。但是,发送方挂钩取决于每个发送者,因为每个人都可以完全控制她/他的存储库,并且就此而言,是否要调用任何挂钩。

如果每个人都会自愿选择加入,你可以为他们提供一个钩子:

  • 检查远程名称($1)和/或网址($2);
  • 如果这些匹配您想要保护的存储库,请检查输入流上的任何远程引用是否与refs/heads/master匹配;
  • 如果所有这些检查都适用,请以您喜欢的任何方式检查相应的本地参考和/或哈希。