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

标签 git githooks

在我们的 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/

相关文章:

Windows 终端中的 Git Bash 在单独的窗口中打开

git - 将文件添加到 github :gist thats not text

git - 使用 git 时,有没有办法锁定 fork 上的单个文件或目录?

Git hook 拒绝包含子模块更新的推送?

Git:如何列出精心挑选的提交?

git - 使用 onto 撤消 git rebase

git - 更改 Git 存储库目录位置。

git - Bitbucket 上的服务器端 Hook

Git Hook : add a new file to repo if a new branch is created

githooks - 指定在 git commit --no-verify 上跳过哪个钩子(Hook)