Git:阻止master分支中的提交

Ras*_*ard 52 git merge fast-forward

(为简单起见)我有一个master分支和一个dev在我的Git-repo中.我想确保master分支始终正常工作,因此我所做的所有工作都应该在dev分支机构中.

但是,当我将合并中的更改--no-ff合并时,我倾向于留在master分支中,并继续在其中工作(因为我忘了检查我的dev分支).

我可以为master分支建立一个规则,它表示我不能提交,快进合并,但只能--no-ff从另一个分支合并?

这必须适用于私有托管存储库(而不是GitHub和BitBucket).

qzb*_*qzb 110

对的,这是可能的.您必须创建预提交挂钩,拒绝提交到主分支.当你调用merge命令时,Git不会调用pre-commit钩子,所以这个钩子只会拒绝常规提交.

  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使其可执行(Windows上不需要):

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

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

[branch "master"]
    mergeoptions = --no-ff
Run Code Online (Sandbox Code Playgroud)

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

  • 此外,这仅适用于我们的本地git仓库,我们如何为所有开发人员执行不同git repos的规则,而无需手动更改.git目录的内容? (7认同)
  • @qzb,正确的运算符是"="而不是"==" (4认同)
  • 这看起来和我需要的一模一样——这在 Windows 中也能工作吗? (2认同)
  • @RasmusBækgaard是的它会:钩子的bash脚本将被Git for Windows中包含的Git bash解释.(你只需要chmod步骤) (2认同)
  • 很好,对于任何想要在项目存储库中添加这些规则或其他git钩子的方法,请查看这个简单的npm包:https://github.com/kilianc/shared-git-hooks,因为你不能包含任何东西位于.git目录下的存储库. (2认同)
  • 找到 `-n` "这个选项绕过了 pre-commit 和 commit-msg 钩子。" (2认同)

JGC*_*JGC 21

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

设置

基本的设置过程是:

  • 使用 pip 或 brew 安装(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']
Run Code Online (Sandbox Code Playgroud)

如果你想保护多个分支,你可以--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']
Run Code Online (Sandbox Code Playgroud)

这不是矫枉过正吗?

Pre-commit 有许多其他内置挂钩,以及大量社区构建的挂钩,它们将改变您清理和验证提交的方式。我提到这一点的原因是,虽然这个工具只是阻止提交到受保护的分支可能有点矫枉过正,但它还有许多其他功能,使其成为任何 git 项目的引人入胜且简单的补充。

  • 超级有用!我一定会尝试一下,感谢@JGC 提供的信息 (4认同)
  • 谢谢你,一个很好的建议!请注意,如果没有“--branch”,则默认覆盖“main”和“master”。 (3认同)

Mic*_*mia 11

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

git config --global core.hooksPath ~/githooks
Run Code Online (Sandbox Code Playgroud)

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

  • 这就是大多数情况下你可能要做的 (2认同)