114

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

但是,当我将更改与--no-ff合并合并时,我倾向于留在master分支中,并继续在其中工作(因为我忘记签出我的dev分支)。

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

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

4

3 回答 3

196

对的,这是可能的。您必须创建一个拒绝提交到主分支的预提交挂钩。当您调用合并命令时, 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

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

于 2016-11-07T12:40:35.450 回答
30

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

设置

基本的设置过程是:

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

保护分支的基本配置

这是一个仅包含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 项目的引人注目且简单的补充。

于 2020-03-19T17:22:28.403 回答
12

通过全局安装它可能是有意义的

git config --global core.hooksPath ~/githooks

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

于 2019-10-22T09:14:09.903 回答