(为简单起见)我的Git-repo中有master
分支和dev
。
我想确保master
分支始终有效,因此我所做的所有工作都应该在dev
分支中。
然而,当我将我的更改与--no-ff
合并合并时,我倾向于留在master
分支中,并继续在其中工作(因为我忘了查看我的{{1}分支)。
我可以为dev
分支建立一个规则,它表示我不能做提交,快进合并,但只有master
从另一个分支合并?
这必须适用于私有托管存储库(而不是GitHub和BitBucket)。
答案 0 :(得分:83)
是的,有可能。您必须创建预提交挂钩,拒绝提交到主分支。当你调用 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 上不需要):
$ chmod +x .git/hooks/pre-commit
要禁用快进合并,您还必须在 .git / config 文件中添加以下选项:
[branch "master"]
mergeoptions = --no-ff
如果您还希望保护遥控器上的主分支,请选中以下答案:How to restrict access to master branch on git
答案 1 :(得分:11)
您可以使用pre-commit实用程序执行此操作。它具有内置的no-commit-to-branch
挂钩,可用于防止提交到一个或多个分支。
基本设置过程为:
.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']
预提交还有许多其他built-in hooks, and a large collection of community-built hooks,它们将改变您清理和验证提交的方式。我之所以提到它,是因为虽然该工具可能只是阻止阻止提交到受保护的分支而过分杀伤,但它具有许多其他功能,使其成为任何git项目的引人注目且简单的添加。
答案 2 :(得分:2)
通过以下方式进行全局安装可能很有意义
git config --global core.hooksPath ~/githooks
并将该pre-commit
文件移动到该目录