有没有办法配置git仓库以拒绝'git push --force'命令?

51

我在想是否有办法在一个仓库上(仅限于主分支)阻止使用 'git push --force' 命令。

假设我有一个远程的 git 仓库,然后进行以下操作:

  • 对 'master' 分支执行 'git push' 命令。它可以正常工作。
  • 对 'branch-1' 分支执行 'git push --force' 命令。它可以正常工作。
  • 对 'master' 分支执行 'git push --force' 命令。它会被拒绝。

这种情况是否可能发生?

3个回答

52

设置配置变量:

receive.denyNonFastForwards
receive.denyDeletes

这将阻止任何“强制”推送跨所有分支生效。

如果您想要更精细的分支控制,那么您需要在远程仓库上使用一个“hook”,可能是“update”钩子。

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

gitweb 链接


4
给这个钩子点个赞(原始版本:http://git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/hooks/update-paranoid;hb=080cbc1275ac09445136ba429d90b5ec85e92c1c) - VonC
4
有没有 GitHub 的相关方法可以做到这一点? - Tomáš Fejfar
GitHub 上的 update-paranoid:https://github.com/git/git/blob/master/contrib/hooks/update-paranoid - go2null

7

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

你可以在设置 -> 分支 -> 受保护分支中找到它。该功能现在对所有用户开放,不仅限于企业用户!

这种“保护”可以为任何分支启用,也可以为任何用户(包括管理员)启用。

更多详情请参见https://help.github.com/articles/defining-the-mergeability-of-pull-requests/

因此,不再需要使用钩子和任意代码。


是的,但在撰写原始帖子时它并不存在。 :) - Per Lundberg
这只存在于Github上,而不是普通的git。原帖没有提到Github。 - gpvos

4

我编写了这个快速更新钩子,以防止在存储库的“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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接