我在GitHub上有一个仓库,其中有几个分支。
如何设置主要仓库的配置以设置receive.denyNonFastForwards
标志,以便主要仓库只能接受快进式推送,并将拒绝任何非快进式推送,即使它们是--forced
。
GitHub没有公开此功能,但有两个选项:
GitHub支持团队可以在某个仓库上设置此功能。
您可以通过将GitHub存储库设置为另一个您更容易控制的存储库的镜像来模拟此功能。只给予GitHub帐户的最小负责人和用于镜像的帐户写入权限。非GitHub存储库是您设置receive.denyNonFastForwards
的地方,并且所有人都可以进行推送。然后可以通过使用post-receive
钩子、cron作业或两者的组合来完成镜像。选择两种方式的原因是可以使两个存储库之间的时间差最小化,即使post-receive
钩子未能更新GitHub(例如,如果GitHub宕机),也可以确保一切都是最新的。
你可以通过另一个中心,如 sourceforge.net
,使用 ssh 连接来完成。
只需将其用作 github.com
的镜像,并定期同步即可。
sourceforge.net
的另一个高级功能是,您可以使用动态密码(2FA)而无需外部连接。您只需安装谷歌的 2FAS
手机应用程序并设置中心提供的私钥,然后您就可以使用密码的动态部分进行身份验证,而无需任何外部连接(无需互联网或短信)。
优点
github.com
之外备份,可以在推送重写前后比较两个存储库。master
分支推送到新的远程分支(例如master-<id>
)来避免在远程sf.net
存储库中切换receive.denyNonFastForwards
标志。然后,将其与以前同步的master-<id>
进行比较。这将完全避免合并,因为git新分支的创建/删除是一项廉价操作。但是,由于当前分支保护了receive.denyDeleteCurrent
变量,因此您无法轻松删除sf.net
中的当前分支,因此当前主分支处于休眠状态。缺点
sf.net
上为每个在github.com
上的仓库分配一个仓库,并控制同步。但仍然有一个优点-对于sf.net
上的所有新存储库,默认情况下都会打开receive.denyNonFastForwards
标志。