GitHub允许您配置存储库,以使用户无法强制推送到母版库,但是有没有办法阻止推送到母版库?我希望做到这一点,以便添加到master提交的唯一方法是通过GitHub pull request UI。
GitHub允许您配置存储库,以使用户无法强制推送到母版库,但是有没有办法阻止推送到母版库?我希望做到这一点,以便添加到master提交的唯一方法是通过GitHub pull request UI。
Answers:
当前接受的答案实际上是正确的,但是如果您是组织所有者或拥有管理员权限(如果创建了存储库,则是这种情况),您仍然可以推送到受保护的分支机构。从Github文档中https://help.github.com/en/articles/about-branch-restrictions:
组织所有者和具有存储库管理员权限的人始终能够推送到受保护的分支。
对于任何其他类型的协作者,git push
都会失败。
如果您确实想禁用全部推送qt,则必须通过配置无效pushRemote
的分支来本地设置,如前所述:
git config branch.master.pushRemote no_push
或者您可以设置一个预推钩子,如下所示:https : //gist.github.com/vlucas/8009a5edadf8d0ff7430
您可以启用分支机构限制并决定允许谁(按组织的用户和团队)推送。
https://help.github.com/articles/about-branch-restrictions/
«注意:如果选中了“包括管理员”,并且在分支上启用了必需的状态检查,但它们失败,则无论用户或团队的许可状态如何,将更改推送到基本分支的任何尝试也将失败。»
git config branch.master.pushRemote no_push
。
启用状态检查后,直接推送到远程主服务器将被拒绝,这意味着在远程主服务器上添加提交的唯一方法是在GitHub上合并拉请求(通过状态检查)。
这是需要状态检查的master分支的实验结果:
C:\GitRepo\GitHub\TomoyukiAota\photo-location-map [master ↑1]> git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 305 bytes | 305.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: 3 of 3 required status checks are expected.
To https://github.com/TomoyukiAota/photo-location-map.git
! [remote rejected] master -> master (protected branch hook declined)
error: failed to push some refs to 'https://github.com/TomoyukiAota/photo-location-map.git'
C:\GitRepo\GitHub\TomoyukiAota\photo-location-map [master ↑1]>
如果您在Github上的私人仓库上使用免费计划,则可能无法使用受保护的分支功能。因此,您需要阻止本地的任何推送/提交。
我这样做是为了使其在本地工作并分发给所有回购成员。
首先,您需要安装沙哑机以控制预提交和预推挂钩。然后,我制作了一个预推式bash脚本,并将其提交到存储库中。然后从带有husky参数的husky预推钩中调用此脚本。
这是我的沙哑配置package.json
(可以根据需要设置单独的配置)
"husky": {
"hooks": {
"pre-commit": "./commands/pre-commit",
"pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
}
},
如您所见,我有2个脚本,一个用于预推脚本,一个用于预提交脚本。
这是我的commands/pre-push
bash脚本
#!/bin/bash
echo -e "===\n>> Talenavi Pre-push Hook: Checking branch name / Mengecek nama branch..."
BRANCH=`git rev-parse --abbrev-ref HEAD`
PROTECTED_BRANCHES="^(master|develop)"
if [[ $1 != *"$BRANCH"* ]]
then
echo -e "\n🚫 You must use (git push origin $BRANCH) / Anda harus menggunakan (git push origin $BRANCH).\n" && exit 1
fi
if [[ "$BRANCH" =~ $PROTECTED_BRANCHES ]]
then
echo -e "\n🚫 Cannot push to remote $BRANCH branch, please create your own branch and use PR."
echo -e "🚫 Tidak bisa push ke remote branch $BRANCH, silahkan buat branch kamu sendiri dan gunakan pull request.\n" && exit 1
fi
echo -e ">> Finish checking branch name / Selesai mengecek nama branch.\n==="
exit 0
该脚本基本上将执行以下两项操作:
master
anddevelop
分支)。他们需要在自己的分支中工作,然后创建拉取请求。fix/someissue
但随后您错误地键入git push origin master
。有关更多详细说明,请参见本文:https :
//github.com/talenavi/husky-precommit-prepush-githooks
如果您使用的是Node,则可以使用husky创建预推送验证,该验证不会发生直接推送到master的情况。这样,您仍然可以使用管理员权限来合并PR。我猜其他语言也有类似的解决方案。
npm install husky --save-dev
/.huskyrc.js
:const preventPushToMaster = `branch=\`git symbolic-ref HEAD\`
if [ "$branch" = "refs/heads/master" ]; then
echo "\\033[31mDirect push to master is not allowed.\\033[0m"
exit 1
fi`;
module.exports = {
hooks: {
'pre-push': preventPushToMaster,
},
};