防止在GitHub上推送掌握?

jos*_*hlf 28 git branch github access-control pull-request

GitHub允许您配置您的存储库,以便用户不能强制推送掌握,但有没有办法阻止推送到完全掌握?我希望这样做,以便添加到提交到master的唯一方法是通过GitHub pull请求UI.

Cor*_*ory 92

自从最初的问题/答案以来,Github 在受限分支 UI 中添加了一个新选项,允许您进行设置。

合并前需要拉取请求审查启用后,所有提交都必须提交到不受保护的分支,并通过拉取请求提交,该拉取请求具有所需数量的批准审查,并且在合并到符合此规则的分支之前没有请求任何更改。

要找到它,请转到设置 > 分支 > 分支保护规则,然后单击“添加规则”。 按照说明操作后的 Github UI 然后,输入您要保护的分支的名称并单击复选框以在合并前要求拉取请求审查。 带有单击按钮的 Github UI 默认情况下,这只会阻止不是版主的人。后面还有另一个复选框,用于确保即使是版主也无法合并。 Github UI 与其他按钮单击

  • 这会在合并时强制进行审查,但不会阻止直接提交并推送到 master。至少在我的回购协议上是这样。 (85认同)
  • 看起来该选项现在称为“不允许绕过上述设置”。 (19认同)
  • @Damien 你设置了“包括管理员”标志吗?因为如果没有,你应该仍然可以直接推送到master。或者,您可以以没有管理员权限的不同用户身份测试推送。 (17认同)
  • 如果我不想要求评论怎么办?我只想将拉取请求合并到主分支。我不关心拉取请求的状态。 (6认同)
  • 受保护的分支可供 Pro、Team 和 Enterprise 用户在私人存储库上使用,而不是免费用户 (4认同)
  • 嗯,我想也许你也必须保护分支? (2认同)

Tom*_*ota 12

Directly pushing to remote's master is rejected when status checks are enabled, meaning that the only way to add commits on remote's master is merging pull requests (which pass the status checks) on GitHub.

Here is my experiment result for the master branch requiring status checks:

  1. Create a commit on the master branch on my PC.
  2. Push to remote's master.
  3. A rejection message appears. The commit is not pushed to remote in the end.
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]>
Run Code Online (Sandbox Code Playgroud)

  • 作为仓库管理员为我工作,启用了“包括管理员”。 (3认同)

Mic*_*zko 11

我希望能够将提交添加到 master 的唯一方法是通过 GitHub 拉取请求 UI。

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

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

.github/workflows/requirePullRequest.yml.

name: require pull request

on:
  pull_request:
    branches:
      - master

jobs:
  job:
    name: require pull request
    runs-on: ubuntu-latest
    steps:
      - run: echo hello
Run Code Online (Sandbox Code Playgroud)

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

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

这样,GitHub 将拒绝所有直接推送到主分支,并且拉取请求不会因任何原因而延迟。

  • 非付费用户请注意:这是 Github 中的一项高级功能,位于“设置”>“分支”下。如果您没有付费版本的 Github,这可能不是您想要的解决方案。 (2认同)

Zol*_*üle 10

我需要避免意外地将任何提交推送到主分支。这是一个类似于 @christian-chandra 的解决方案,但更简单。

转到您的本地工作副本并

$ cd .git/hooks
echo '' > pre-commit
$ chmod +x pre-commit
Run Code Online (Sandbox Code Playgroud)

将此内容添加到文件中(预提交)

#!/bin/sh

branch="$(git rev-parse --abbrev-ref HEAD)"

if [ "$branch" = "master" ]; then
  echo "Master Branch commit is blocked"
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

完毕!

  • 对于意外推送很有用,但可以通过从 .git 目录中删除钩子来轻松绕过它。 (2认同)

phd*_*phd 8

您可以启用分支限制并决定允许谁(根据组织的用户和团队)推送。

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

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

  • 但是是否可以防止从本地推送到远程,并且只接受 Github UI 上的每个 Pull-Request 合并? (19认同)
  • Fwiw,为了防止在本地推送到 master,您可以在 git config 中添加以下内容:`git config branch.master.pushRemote no_push`。 (8认同)

小智 8

当前接受的答案实际上是正确的,但是如果您是组织所有者或拥有管理员权限(如果创建了存储库,则是这种情况),您仍然可以推送到受保护的分支机构。从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

  • 不得不提的是 `pushRemote` 方式仅适用于使用 git 命令推送到终端时,如果你像我一样使用 IntelliJ 推送,它仍然有效 (3认同)

小智 6

如果您在 Github 的私有仓库上使用免费计划,您可能无法使用受保护的分支功能。所以你需要阻止来自本地的任何推送/提交。

这就是我为使其在本地工作并分发给所有 repo 成员所做的工作。

首先,你需要安装 husky 来控制 pre-commit 和 pre-push hook。然后,我制作了一个 pre-push bash 脚本并将其提交到存储库中。然后从带有 husky 参数的 husky pre-push hook 中调用此脚本。

这是我里面的 husky 配置package.json(如果需要,可以设置单独的配置)

"husky": {
    "hooks": {
        "pre-commit": "./commands/pre-commit",
        "pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
    }
},
Run Code Online (Sandbox Code Playgroud)

如您所见,我有 2 个脚本,一个用于预推送,一个用于预提交。

这是我的commands/pre-pushbash 脚本

#!/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
Run Code Online (Sandbox Code Playgroud)

该脚本基本上会做两件事:

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

有关更详细的说明,您可以从本文中遵循:https :
//github.com/talenavi/husky-precommit-prepush-githooks