防止在master分支中提交


84

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

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

我可以为master分支建立一条规则,该规则指出我不能进行提交,并且不能进行快速合并,而只能--no-ff从另一个分支进行合并?

这必须适用于私有托管存储库(ergo不适用于GitHub和BitBucket)。


4
“快速提交”不是一回事。提交只是提交,git commit是新提交,没有快进的情况发生。听起来好像您只想在当前分支为时禁止普通提交master,在这种情况下,请查看pre-commit挂钩。
torek '16

Answers:


154

对的,这是可能的。您必须创建预提交钩子,该钩子拒绝对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分支,请检查以下答案:如何限制对git上master分支的访问


这看起来完全符合我的需求-在Windows中也可以使用吗?
RasmusBækgaard16年

2
@RasmusBækgaard是的:钩子的bash脚本将由Windows Git中包含的Git bash解释。(您不需要chmod步骤)
VonC

注意:您还可以防止自己master被推入预推钩中的远程分支。例如:gist.github.com/aaronhoffman/ffbfd36928f9336be2436cffe39feaec
Aaron Hoffman

4
好的,对于任何想在项目存储库中添加这些规则或其他git钩子的人,请检查以下简单的npm软件包:github.com/kilianc/shared-git-hooks,因为您不能在.git目录进入存储库。
乔治·迪米特里亚迪斯

9
此外,这仅适用于我们本地的git仓库,我们如何在不让他们手动更改.git目录内容的情况下为所有开发人员在不同的git仓库中实施规则?
亚历山大·米尔斯

13

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

设定

基本设置过程为:

  • 使用pip或brew安装(有关说明,访问https://pre-commit.com/#install
  • .pre-commit-config.yaml在项目的根目录中创建一个文件(初稿请参见下文)
  • 通过运行将钩子安装到git config中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在参数列表中包含多个args:

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项目的引人注目的和简单的添加。


7

通过以下方式全局安装它可能很有意义

git config --global core.hooksPath ~/githooks

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


如果我有多个存储库该怎么办-不会影响所有存储库吗?
RasmusBækgaard19年

1
那就是您在大多数情况下可能要做的事情
Michel Samia

说我有一个奇怪的项目,他们将其重命名masterProduction-可以进行例外处理吗?
RasmusBækgaard19年

您可以在bash中使用或运算符来指定要在客户端保护的更多分支
Michel Samia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.