在我们的 git 服务器上,我们有一个 git 配置
[receive]
denyDeletes = true
denynonfastforwards = true
这是一个非常明智的设置,因为它可以阻止重要分支上的错误强制更新。然而,有许多分支强制更新会很有用。
除了使用此全局设置之外,还有一种简单的方法可以实现此功能。
我认为可以通过 git pre-recieve hook 实现,但是我不确定如何检查推送是否是强制非快进。
我知道通过 Git 托管软件(例如 gitolite)有完整的解决方案,但我希望在一个简单的基于 ssh 的服务器上实现这一点。
最佳答案
您可以使用更新 Hook 来完成此操作。对于使用三个参数更新的每个引用,它会被调用一次:(1) 引用名称,(2) 该分支的更新前提交 ID(如果您正在创建分支,则为“0”*40),以及(3) 该分支的更新后提交 ID(如果要删除该分支,则为“0”*40)。如果不是创建或销毁,那么您可以运行 git merge-base old-rev new-rev 。如果结果与旧版本相同,则更新是快进。否则,更新是对不是前一个头的后代的强制推送。
在我的更新 Hook 中,我允许强制更新以用户名开头的分支,例如,wolf 可以强制推送 wolf/*
中的任何分支,但只有用户白名单才能更新这些分支没有前缀的分支,例如 master
。
这里是一个示例更新 Hook 的链接,它正是这样做的,如 SourceForge 的 Allura 项目中所使用的: https://forge-allura.apache.org/p/allura/git/ci/master/tree/scripts/git-hooks/for-the-remote-repo/update update
关于Git 设置允许强制更新某些分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21119293/