有没有办法配置 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 存储库以使用我刚刚创建的新个人访问令牌? [复制]