【问题标题】:Allow only one branch to be pushed to remote只允许将一个分支推送到远程
【发布时间】:2017-11-09 11:56:58
【问题描述】:

我们有一个使用 OpenShift 的 Git 遥控器(用于生产)。

在本地,我想确保只有 master 分支可以推送到这个远程。我应该采取什么特殊步骤来确保发生这种情况,还是应该只依赖 Git 默认设置?

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

git push prod_remote a_feature_branch:master

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

【问题讨论】:

    标签: git git-push git-remote


    【解决方案1】:

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

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

    发送方面,您可以使用pre-push 挂钩来做更多事情。预推挂钩运行:

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

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

    • 本地引用(例如,refs/heads/<em>branch</em>
    • 本地哈希 ID
    • 远程参考
    • 远程哈希 ID

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

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

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

    【讨论】:

    • 谢谢,我会尽快调查,感谢详细信息
    • 实际上,在许多托管系统中,您可以阻止人们“推送到master”,就像阻止他们修改分支指针一样。换句话说,您不会阻止他们在 master 之上添加两个新提交,但您可以阻止他们将 master 分支指针移动到这两个提交中的最后一个,实质上是您阻止它们 包括 master 上的更多提交。在 GitHub 上,您可以使用“受保护的分支”来完成其中的一些操作,BitBucket 也有类似的东西。
    • @LasseV.Karlsen:当然,但这不是他想要的:他想确保没有人跑git push remote HEAD:mastergit push remote foo:master 或类似的,只允许git push remote master:master。受保护的分支意味着只有特定的用户(即那些留下身份验证轨迹的用户)可以推送任何东西
    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 2020-06-09
    • 2023-03-11
    • 2017-03-30
    • 2016-11-06
    • 2022-01-15
    相关资源
    最近更新 更多