防止在 master 分支中提交
Prevent commits in master branch
(为简单起见)我的 Git 存储库中有一个 master
分支和一个 dev
。我想确保 master
分支始终正常工作,所以我所做的所有工作都应该在 dev
分支中。
然而,当我将更改合并到 --no-ff
合并时,我倾向于留在 master
分支中,并继续在其中工作(因为我忘记检查我的 dev
分支)。
我可以为 master
分支制定一条规则,声明我不能进行提交和快进合并,但只能 --no-ff
从另一个分支合并吗?
这必须适用于私有托管存储库(因此,不适用于 GitHub 或 Bitbucket)。
是的,这是可能的。您必须创建一个预提交挂钩,拒绝提交到 master 分支。当您调用 merge 命令时,Git 不会调用预提交挂钩,因此该挂钩将仅拒绝常规提交。
转到您的存储库。
创建一个文件,.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 上不需要):
chmod +x .git/hooks/pre-commit
要禁用 快进 合并,您还必须将以下选项添加到您的 .git/config 文件中:
[branch "master"]
mergeoptions = --no-ff
如果您还想保护远程上的 master 分支,请查看此答案:How to restrict access to master branch in Git
通过
全局安装它可能有意义
git config --global core.hooksPath ~/githooks
并将 pre-commit
文件移至该目录
您可以使用 pre-commit 实用程序来执行此操作。它有一个内置的 no-commit-to-branch
挂钩,可用于防止提交到一个或多个分支。
设置
基本设置过程是:
- 使用 pip or Homebrew (instructions at 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 还有许多其他 built-in hooks, and a large collection of community-built hooks 将改变您清理和验证提交的方式。我提到这一点的原因是,虽然这个工具可能只是为了防止提交到受保护的分支而过分杀伤力,但它具有许多其他功能,使其成为任何 Git 项目的引人注目和简单的补充。
(为简单起见)我的 Git 存储库中有一个 master
分支和一个 dev
。我想确保 master
分支始终正常工作,所以我所做的所有工作都应该在 dev
分支中。
然而,当我将更改合并到 --no-ff
合并时,我倾向于留在 master
分支中,并继续在其中工作(因为我忘记检查我的 dev
分支)。
我可以为 master
分支制定一条规则,声明我不能进行提交和快进合并,但只能 --no-ff
从另一个分支合并吗?
这必须适用于私有托管存储库(因此,不适用于 GitHub 或 Bitbucket)。
是的,这是可能的。您必须创建一个预提交挂钩,拒绝提交到 master 分支。当您调用 merge 命令时,Git 不会调用预提交挂钩,因此该挂钩将仅拒绝常规提交。
转到您的存储库。
创建一个文件,.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 上不需要):
chmod +x .git/hooks/pre-commit
要禁用 快进 合并,您还必须将以下选项添加到您的 .git/config 文件中:
[branch "master"]
mergeoptions = --no-ff
如果您还想保护远程上的 master 分支,请查看此答案:How to restrict access to master branch in Git
通过
全局安装它可能有意义git config --global core.hooksPath ~/githooks
并将 pre-commit
文件移至该目录
您可以使用 pre-commit 实用程序来执行此操作。它有一个内置的 no-commit-to-branch
挂钩,可用于防止提交到一个或多个分支。
设置
基本设置过程是:
- 使用 pip or Homebrew (instructions at 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 还有许多其他 built-in hooks, and a large collection of community-built hooks 将改变您清理和验证提交的方式。我提到这一点的原因是,虽然这个工具可能只是为了防止提交到受保护的分支而过分杀伤力,但它具有许多其他功能,使其成为任何 Git 项目的引人注目和简单的补充。