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