我在想是否有办法在一个仓库上(仅限于主分支)阻止使用 'git push --force
' 命令。
假设我有一个远程的 git 仓库,然后进行以下操作:
- 对 'master' 分支执行 '
git push
' 命令。它可以正常工作。 - 对 'branch-1' 分支执行 '
git push --force
' 命令。它可以正常工作。 - 对 'master' 分支执行 '
git push --force
' 命令。它会被拒绝。
这种情况是否可能发生?
我在想是否有办法在一个仓库上(仅限于主分支)阻止使用 'git push --force
' 命令。
假设我有一个远程的 git 仓库,然后进行以下操作:
git push
' 命令。它可以正常工作。git push --force
' 命令。它可以正常工作。git push --force
' 命令。它会被拒绝。这种情况是否可能发生?
设置配置变量:
receive.denyNonFastForwards
receive.denyDeletes
这将阻止任何“强制”推送跨所有分支生效。
如果您想要更精细的分支控制,那么您需要在远程仓库上使用一个“hook”,可能是“update”钩子。
在 git 的“contrib”文件夹中有一个名为“update-paranoid”的示例更新挂钩,它可能会满足您的需求(以及更多需求)。
Github已经引入了受保护分支的概念!
你可以在设置 -> 分支 -> 受保护分支
中找到它。该功能现在对所有用户开放,不仅限于企业用户!
这种“保护”可以为任何分支启用,也可以为任何用户(包括管理员)启用。
更多详情请参见https://help.github.com/articles/defining-the-mergeability-of-pull-requests/
因此,不再需要使用钩子和任意代码。
我编写了这个快速更新钩子,以防止在存储库的“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
update-paranoid
:https://github.com/git/git/blob/master/contrib/hooks/update-paranoid - go2null