2017-06-07 43 views
0

我们有一个使用OpenShift的Git远程(用于生产)。只允许将一个分支推送到远端

本地,我想确保只有主分支可以推送到这个远程。我是否应该采取特殊措施来确保这种情况发生,还是应该只依靠Git默认设置?

我99%确定生产Git远程只查看主分支。所以我的理解是,我们可以在本地推动不同分支的唯一方法是这样的:

git push prod_remote a_feature_branch:master 

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

回答

1

接收侧,即接收提交的Git有没有概念的分支名称,如果有的话,贴在提交上发送的Git。它只知道它已经收到了一些对象,然后是一个请求来更新一些引用。如果这些引用拼写为refs/heads/whatever,则它们是名为whatever的分支的分支名称创建,删除或更新操作。

因此,在收到方面,答案是否定的:没有办法阻止任何人这样做。如果他们可以完成提交到接收Git的提交,他们可以提交任何提交以及他们喜欢的任何参考名称更新。您可以使用任何身份验证数据(例如,从ssh或像Gitolite这样的访问控制系统)检查提交和/或参考名称更新,但您对它们的任何内容都不知晓原点,您只有哈希ID和名。

发送方,你可以使用pre-push挂钩做更多的事情。预推钩使用:

  • $1:远程名称,如果推送使用命名远程;
  • $2:对应于$1

的URL(如果不使用远程命名,两个命令行参数是相同的),和在标准输入,线的流,每push的Refspec一行与具有四个项目的每一行:

  • 本地REF(例如,refs/heads/branch
  • 本地散列ID
  • 远程REF
  • 远程散列ID

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

如果大家谁都会自愿选择采用推,你可以为他们提供了一个钩子,将:

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

谢谢我将尽快研究这件事,欣赏详细信息 –

+0

事实上,在许多主机系统中,您*可以*防止人们“推动主人”,以防止他们从*修改*分支指针。换句话说,你不会阻止他们在master之上添加两个新的提交,但是你可以阻止他们将master分支指针移动到这两个提交的最后,实际上你可以防止它们包含*更多的提交在主人身上。在GitHub上,你可以使用“受保护的分支”来完成一些操作,BitBucket也有类似的功能。 –

+0

@ LasseV.Karlsen:当然,但这并不是他想要的:他想确保没有人跑'git push remote head:master','git push remote foo:master'或类似的东西,只允许' git推远程主:主'。受保护的分支仅意味着某些*用户*(即那些身份验证痕迹遗留下来的人)可以推送任何*。 – torek