允许强制更新某些分支的Git设置

允许强制更新某些分支的Git设置,git,githooks,Git,Githooks,在我们的git服务器上,我们有一个 [receive] denyDeletes = true denynonfastforwards = true 这是一个非常合理的设置,因为它可以阻止重要分支上错误的强制更新。但是,强制更新有许多分支是有用的 没有这种全局设置,而是有一种简单的方法来实现此功能 我假设这是可能的,通过一个git pre Receive钩子,但是我不确定如何检查推送是否是强制的非快进 我知道通过Git托管软件(如gitolite)有完整的解决方案,但我希望在一个

在我们的git服务器上,我们有一个

[receive]
    denyDeletes = true
    denynonfastforwards = true
这是一个非常合理的设置,因为它可以阻止重要分支上错误的强制更新。但是,强制更新有许多分支是有用的

没有这种全局设置,而是有一种简单的方法来实现此功能

我假设这是可能的,通过一个git pre Receive钩子,但是我不确定如何检查推送是否是强制的非快进


我知道通过Git托管软件(如gitolite)有完整的解决方案,但我希望在一个简单的基于ssh的服务器上实现这一点。

您可以通过更新挂钩来实现这一点。对于使用三个参数更新的每个引用,将调用一次:(1)引用名称,(2)该分支的更新前提交id(如果正在创建分支,则调用“0”*40),以及(3)该分支的更新后提交id(如果正在删除该分支,则调用“0”*40)。如果不是创建或销毁,那么可以运行
git merge base old rev new rev
。如果结果与旧版本相同,则更新是快进的。否则,更新是一个不是从上一个头部降下来的东西的强制推送

在我的更新钩子中,我允许对以用户名开头的分支进行强制更新,例如,wolf可以强制推送
wolf/*
中的任何分支,但只有白名单用户可以更新那些没有前缀的分支,例如,
master

下面是一个链接,指向一个示例更新挂钩,该挂钩正是在SourceForge的Allura项目中使用的: