Git 防止主分支中的提交

Git 防止主分支中的提交,git,merge,fast-forward,Git,Merge,Fast Forward,(为了简单起见)我在Git repo中有一个master分支和一个dev。 我想确保master分支始终工作,因此我所做的所有工作都应该在dev分支中 但是,当我将中的更改与--no ff合并时,我倾向于留在主分支中,继续在其中工作(因为我忘记签出开发分支) 我是否可以为主分支建立一个规则,该规则说明我不能执行提交和快进合并,但只能从另一个分支进行--no ff合并 这必须适用于私有托管存储库(因此不是GitHub和BitBucket)。是的,这是可能的。您必须创建预提交钩子,该钩子拒绝对主分支

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

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

我是否可以为
主分支
建立一个规则,该规则说明我不能执行提交和快进合并,但只能从另一个分支进行
--no ff
合并


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

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

  • 转到您的存储库
  • 使用以下内容创建文件.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
    
  • 使其可执行(Windows上不需要):

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


    如果您还想保护远程主机上的主分支,请检查以下答案:

    通过

    git config --global core.hooksPath ~/githooks
    
    并将该
    预提交
    文件移动到该目录中

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

    安装程序 基本设置过程是:

    • 使用pip或brew安装(说明见)
    • 在项目的根目录中创建一个
      .pre-commit config.yaml
      文件(参见下面的初稿)
    • 通过运行
      pre-commit Install
      将钩子安装到git配置中
    保护分支的基本配置 下面是一个基本配置,只包括
    no commit to branch
    hook:

    回购协议: -回购:https://github.com/pre-commit/pre-commit-hooks 修订版:v3.3.0 挂钩: -id:不提交到分支 参数:['--branch',master']
    如果要保护多个分支,可以使用在参数列表中包含多个
    --branch
    参数:

    回购协议: -回购:https://github.com/pre-commit/pre-commit-hooks 修订版:v3.3.0 挂钩: -id:不提交到分支 参数:['--branch',master','--branch',staging']
    这不是太过分了吗?
    Pre-commit还有许多其他功能,它们将改变您清理和验证提交的方式。我之所以提到这一点,是因为,尽管这个工具仅仅是为了防止提交到受保护的分支,可能有些过分,但它还有许多其他特性,使它成为任何git项目中引人注目的简单补充。

    “快进提交”不是一件事。提交只是提交,
    git提交
    创建一个新的提交,没有发生快速转发。听起来您只是想在当前分支为
    主分支时禁止普通提交,在这种情况下,查看
    pre-commit
    hook。这看起来和我需要的完全一样-在Windows中也可以吗?@RasmusBækgaard是的,它会:hook的bash脚本将由Git for Windows中包含的Git bash解释。(您不需要chmod步骤)很好,对于任何想在项目存储库中添加这些规则或其他git钩子的人,请检查这个简单的npm包:,因为您不能将驻留在.git目录下的任何内容包含到存储库中。此外,这只适用于我们的本地git repo,我们如何在不让所有开发人员手动更改.git目录的内容的情况下跨不同的git repo强制执行规则?找到
    -n
    “此选项绕过预提交和提交消息挂钩。”如果我有多个存储库怎么办?这不会影响所有存储库吗?在大多数情况下,这就是你可能要做的。我有一个奇怪的项目,他们将
    master
    重命名为
    Production
    -可以进行例外吗?你可以在bash中使用或操作符来指定要在客户端保护的更多分支
    [branch "master"]
        mergeoptions = --no-ff
    
    git config --global core.hooksPath ~/githooks