防止在 master 分支中提交

Prevent commits in master branch

(为简单起见)我的 Git 存储库中有一个 master 分支和一个 dev。我想确保 master 分支始终正常工作,所以我所做的所有工作都应该在 dev 分支中。

然而,当我将更改合并到 --no-ff 合并时,我倾向于留在 master 分支中,并继续在其中工作(因为我忘记检查我的 dev分支)。

我可以为 master 分支制定一条规则,声明我不能进行提交和快进合并,但只能 --no-ff 从另一个分支合并吗?

这必须适用于私有托管存储库(因此,不适用于 GitHub 或 Bitbucket)。

是的,这是可能的。您必须创建一个预提交挂钩,拒绝提交到 master 分支。当您调用 merge 命令时,Git 不会调用预提交挂钩,因此该挂钩将仅拒绝常规提交。

  1. 转到您的存储库。

  2. 创建一个文件,.git/hooks/pre-commit,内容如下:

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  3. 使其可执行(在 Windows 上不需要):

    chmod +x .git/hooks/pre-commit
    

要禁用 快进 合并,您还必须将以下选项添加到您的 .git/config 文件中:

[branch "master"]
    mergeoptions = --no-ff

如果您还想保护远程上的 master 分支,请查看此答案:How to restrict access to master branch in Git

通过

全局安装它可能有意义
git config --global core.hooksPath ~/githooks

并将 pre-commit 文件移至该目录

您可以使用 pre-commit 实用程序来执行此操作。它有一个内置的 no-commit-to-branch 挂钩,可用于防止提交到一个或多个分支。

设置

基本设置过程是:

  • 使用 pip or Homebrew (instructions at https://pre-commit.com/#install)
  • 安装
  • 在项目的根目录中创建一个 .pre-commit-config.yaml 文件(初稿见下文)
  • 通过 运行 pre-commit install.
  • 将挂钩安装到您的 Git 配置中

保护分支的基本配置

这是一个基本配置,仅包含 no-commit-to-branch 挂钩:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

如果要保护多个分支,可以在参数列表中使用包含多个--branch参数:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

这不是太过分了吗?

Pre-commit 还有许多其他 built-in hooks, and a large collection of community-built hooks 将改变您清理和验证提交的方式。我提到这一点的原因是,虽然这个工具可能只是为了防止提交到受保护的分支而过分杀伤力,但它具有许多其他功能,使其成为任何 Git 项目的引人注目和简单的补充。