有没有办法配置 git 存储库以拒绝“git push --force”?

Posted

技术标签:

【中文标题】有没有办法配置 git 存储库以拒绝“git push --force”?【英文标题】:Is there a way to configure git repository to reject 'git push --force'? 【发布时间】:2010-12-17 18:58:32 【问题描述】:

我想知道有没有办法防止在存储库上出现“git push --force”(仅在主分支上)?

假设我有远程 git 存储库并执行以下操作:

'git push' 到 'master'。它有效。 'git push --force' 到 'branch-1'。它有效。 'git push --force' 到 'master'。被拒绝了。

有可能吗?

感谢您的任何回答和建议。

BR, 大卫。

【问题讨论】:

【参考方案1】:

设置配置变量:

receive.denyNonFastForwards
receive.denyDeletes

将防止任何“强制”推送在所有分支中起作用。

如果您想要更好的预分支控制,那么您将不得不在远程存储库上使用“挂钩”,可能是“更新”挂钩。

有一个名为“update-paranoid”的示例更新钩子,它可能在“contrib”文件夹中的 git 发行版中满足您的需要(以及更多)。

gitweb link

【讨论】:

+1 表示钩子(原始版本:git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/hooks/…) 有什么方法可以为 GitHub 做到这一点? update-paranoid 在 GitHub 上:github.com/git/git/blob/master/contrib/hooks/update-paranoid【参考方案2】:

Github 已经引入了受保护分支的概念!

可以在Settings -> Branches -> Protected Branches 下找到。该功能现在可供所有用户使用 - 不仅仅是企业!

可以为任何分支和任何用户(包括管理员)启用此“保护”。

更多细节在这里 - https://help.github.com/articles/defining-the-mergeability-of-pull-requests/

因此不再需要任何钩子和任意代码。

【讨论】:

是的,但在编写 OP 时它并不存在。 :)【参考方案3】:

我编写了这个快速更新钩子来防止存储库中“dev”分支上的非快进更新(推送):

#!/bin/sh

REFNAME=$1
OLDSHA=$2
NEWSHA=$3

if [ "refs/heads/dev" != $REFNAME ]; then
  exit 0
fi

MERGEBASE=$(git merge-base $OLDSHA $NEWSHA)
if [ $OLDSHA = $MERGEBASE ]; then
  exit 0
fi

echo "Not a fast-forward on branch dev"
exit 1

【讨论】:

以上是关于有没有办法配置 git 存储库以拒绝“git push --force”?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置我的本地 Git 存储库以使用我刚刚创建的新个人访问令牌? [复制]

如何将丢失的 gradle-wrapper.jar 添加回 Git 存储库以供 Jenkins 完成其工作

vref 拒绝推送新的分支

将 Bitrise 配置文件存储在 git 存储库中

有没有办法列出终端中的所有 git 存储库?

如何在github中建立存储库以进行组织?