防止在主分支中提交

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

然而,当我合并我的变化与 --no-ff合并,我往往留在 master分支,只是继续在它的工作(因为我忘记检查我的 dev分支)。

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

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

72629 次浏览

是的,有可能。您必须创建一个拒绝向主分支提交的预提交钩子。当您调用 合并命令时,Git 不会调用 pre-commit hook,所以这个 hook 只会拒绝常规的提交。

  1. 去你的仓库。

  2. 创建一个文件 . git/hook/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. 使其可执行(在 窗户上不需要) :

    chmod +x .git/hooks/pre-commit
    

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

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

如果还想保护远程控制器上的主分支,请检查以下答案: 如何在 Git 中限制对主分支的访问

在全球范围内安装它可能是有意义的

git config --global core.hooksPath ~/githooks

并将 pre-commit文件移动到该目录中

您可以使用 提前承诺实用程序来完成这项工作。它有一个内置的 no-commit-to-branch钩子,可用于防止提交到一个或多个分支。

设置

基本的设置过程是:

  • 使用 Pip自酿的安装(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 还有许多其他的 内置的钩子,和大量的社区建造的钩子集合,它们将改变您清理和验证提交的方式。我之所以提到这一点是因为,虽然这个工具可能仅仅是为了防止提交到受保护的分支而杀伤力过大,但是它还有许多其他特性,使它成为任何 Git 项目的一个引人注目的简单补充。