在我们的git服务器上,我们有一个
的git配置[receive]
denyDeletes = true
denynonfastforwards = true
这是一个非常明智的设置,因为它可以阻止重要分支上的错误强制更新。但是,有许多分支强制更新是有用的。
有一种简单的方法可以实现此功能,而不是使用此全局设置。
我认为可以通过git预接收钩子,但是我不确定如何检查推动是否是强制非快进。
我知道通过Git托管软件(如gitolite)有完整的解决方案,但我希望在一个简单的基于ssh的服务器上实现这一点。
答案 0 :(得分:2)
您可以使用更新挂钩执行此操作。对于每个使用三个参数更新的引用,它被调用一次:(1)引用名称,(2)该分支的更新前提交ID(如果您正在创建分支,则为“0”* 40),以及(3)该分支的更新后commit-id(如果删除该分支,则为'0'* 40)。如果它不是创建或销毁,那么您可以运行git merge-base old-rev new-rev
。如果结果与old-rev相同,则更新是快进的。否则,更新是对前一个头部没有下降的东西的强制推动。
在我的更新挂钩中,我允许对以用户名开头的分支进行强制更新,例如,狼可以强制推送wolf/*
中的任何分支,但只有白名单的用户才能更新那些没有前缀的分支,例如,master
。
这是一个示例更新挂钩的链接,正如SourceForge中的Allura项目中所使用的那样:https://forge-allura.apache.org/p/allura/git/ci/master/tree/scripts/git-hooks/for-the-remote-repo/update update