GitHub允许你配置你的存储库,这样用户就不能强制push到master,但是有没有办法完全防止push到master呢?我希望这样做,添加到提交到master的唯一方法是通过GitHub拉请求UI。
当前回答
当前接受的答案实际上是正确的,但如果您是组织所有者或具有管理权限(如果您创建了回购,则属于这种情况),则仍然可以推送到受保护的分支。从Github文档https://help.github.com/en/articles/about-branch-restrictions:
组织所有者和具有存储库管理权限的人员总是能够推送到受保护的分支。
对于任何其他类型的协作者,git push将失败。
如果你真的想禁用推送,那么你必须在本地设置一个无效的pushRemote为一个分支,如前所述:
git配置branch.master.pushRemote no_push
或者通过创建一个预推钩子,如下所示:https://gist.github.com/vlucas/8009a5edadf8d0ff7430
其他回答
如果您正在使用Node,您可以使用husky创建一个预推送验证,以确保不会发生直接推送到master的情况。这样,您仍然可以使用管理员权限来合并pr。我想其他语言对husky也有类似的解决方案。
NPM安装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,
},
};
您可以启用分支限制,并决定允许谁(根据组织的用户和团队)推送。
https://help.github.com/articles/about-branch-restrictions/
«注意:如果“包括管理员”被选中,并且您已经在分支上启用了所需的状态检查,并且它们失败了,那么任何将更改推到基础分支的尝试也将失败,无论用户或团队的权限状态如何。»
我需要避免意外地将任何提交推到主分支。 这是一个类似于@christian-chandra的解决方案,但更简单。
转到本地工作副本,然后
$ cd .git/hooks
echo '' > pre-commit
$ chmod +x pre-commit
将此内容添加到文件(预提交)
#!/bin/sh
branch="$(git rev-parse --abbrev-ref HEAD)"
if [ "$branch" = "master" ]; then
echo "Master Branch commit is blocked"
exit 1
fi
完成了!
当前接受的答案实际上是正确的,但如果您是组织所有者或具有管理权限(如果您创建了回购,则属于这种情况),则仍然可以推送到受保护的分支。从Github文档https://help.github.com/en/articles/about-branch-restrictions:
组织所有者和具有存储库管理权限的人员总是能够推送到受保护的分支。
对于任何其他类型的协作者,git push将失败。
如果你真的想禁用推送,那么你必须在本地设置一个无效的pushRemote为一个分支,如前所述:
git配置branch.master.pushRemote no_push
或者通过创建一个预推钩子,如下所示:https://gist.github.com/vlucas/8009a5edadf8d0ff7430
当启用状态检查时,直接推送到远程的主服务器将被拒绝,这意味着在远程的主服务器上添加提交的唯一方法是合并GitHub上的拉请求(通过状态检查)。
下面是我对需要状态检查的主分支的实验结果:
在我的PC上的主分支上创建一个提交。 推到遥控器的主人。 出现拒绝消息。最后提交不会推送到远程。
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]>
推荐文章
- Visual Studio Code: .git文件夹/文件隐藏
- “node_modules”文件夹应该包含在git存储库中吗
- 为什么git-rebase给了我合并冲突,而我所做的只是压缩提交?
- 如何运行一个github-actions步骤,即使前一步失败,同时仍然失败的工作
- 当我试图推到原点时,为什么Git告诉我“没有这样的远程‘原点’”?
- 在GitHub repo上显示Jenkins构建的当前状态
- 如何从远程分支中挑选?
- 如何查看一个分支中的哪些提交不在另一个分支中?
- 如何取消在github上的拉请求?
- HEAD和master的区别
- GIT克隆在windows中跨本地文件系统回购
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错