防止在GitHub上推送掌握?

时间:2017-09-10 23:34:47

标签: git github branch access-control pull-request

GitHub允许您配置存储库以便users can't force push to master,但有没有办法阻止完全掌握?我希望能够通过GitHub拉取请求UI添加到提交的唯一方法。

7 个答案:

答案 0 :(得分:9)

当前接受的答案实际上是正确的,但是如果您是组织所有者或拥有管理员权限(如果创建了存储库,则是这种情况),您仍然可以推送到受保护的分支机构。摘自https://help.github.com/en/articles/about-branch-restrictions的Github文档:

  

组织所有者和具有存储库管理员权限的人始终能够推送到受保护的分支。

对于任何其他类型的协作者,git push将失败。

如果您确实要禁用全部推送qt,则必须通过为分支配置无效的pushRemote来在本地进行设置,如前所述:

git config branch.master.pushRemote no_push

或者您可以设置一个预推钩子,如下所示:https://gist.github.com/vlucas/8009a5edadf8d0ff7430

答案 1 :(得分:4)

您可以enable branch restrictions并决定允许推送谁(就组织的用户和团队而言)。

https://help.github.com/articles/about-branch-restrictions/

«注意:如果选中“包含管理员”并且您已在分支上启用了所需的状态检查并且它们失败,则无论用户或团队的权限状态如何,任何将更改推送到基本分支的尝试也将失败。»

答案 2 :(得分:3)

如果您在Github中的私人仓库上使用免费计划,则可能无法使用受保护的分支功能。因此,您需要阻止本地的任何推送/提交。

这就是我使它在本地工作并分发给所有回购成员的方式。

首先,您需要安装husky以控制预提交和预推挂钩。 然后,我制作了一个预推式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

该脚本基本上可以完成两件事:

  • 此脚本将阻止尝试推送到某个分支的任何人(在我的情况下,我不希望任何人(包括我自己)直接推送到masterdevelop分支)。他们需要在自己的分支中工作,然后创建拉取请求。
  • 此脚本将阻止尝试推送到与其当前活动分支不同的分支的任何人。例如,您在分支fix/someissue中,但是错误地键入了git push origin master

有关更多详细说明,请参见本文:
https://github.com/talenavi/husky-precommit-prepush-githooks

答案 3 :(得分:1)

如果您使用的是Node,则可以使用husky创建一个预推送验证,该验证不会直接推送到master。这样,您仍然可以使用管理员权限来合并PR。我猜其他语言也有类似的解决方案。

  1. npm install husky --save-dev
  2. /.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,
  },
};

答案 4 :(得分:1)

<块引用>

我希望做到这一点,以便将提交添加到 master 的唯一方法是通过 GitHub 拉取请求 UI。

我有一个解决方案,可以防止推送到主分支,并且不需要批准或长时间的状态检查来传递拉取请求。

诀窍是创建一个立即通过的状态检查。

.github/workflows/requirePullRequest.yml 中创建以下 GitHub 操作。

name: require pull request

on:
  pull_request:
    branches:
      - master

jobs:
  job:
    name: require pull request
    runs-on: ubuntu-latest
    steps:
      - run: echo hello

接下来,更新存储库设置以要求通过 require pull request 状态检查。

如果您希望管理员遵循相同的规则,那么您必须检查 include administrators 规则。

这样,GitHub 将拒绝所有对主分支的直接推送,拉取请求不会被任何延迟。

答案 5 :(得分:0)

启用status checks时,直接推送到远程主服务器被拒绝,这意味着在远程主服务器上添加提交的唯一方法是在GitHub上合并合并请求(通过状态检查)。

这是我需要状态检查的master分支的实验结果:

  1. 在我的PC的master分支上创建一个提交。
  2. 推送到远程主机。
  3. 出现拒绝消息。最终提交不会被推送到远程。
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]>

答案 6 :(得分:0)

自原始问题/答案以来,Github已在受限分支用户界面中为此添加了一个新选项,使您可以进行设置。

  

在合并之前需要拉取请求审核。启用后,所有提交都必须提交到不受保护的分支,并通过   带有所需数量的批准审核的拉取请求,没有   可以将其合并到匹配的分支之前请求的更改   这条规则。