git禁止在master分支push和commit
时间:2022-07-26
本文章向大家介绍git禁止在master分支push和commit,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
作为管理者,在远端将master分支设为保护分支,可以从根源上杜绝直接推送到master的问题。dev分支同理。
作为开发者,在本地的git hook中加配置可以做到在commit和push操作时做对应的检查
禁止在master分支上Commit
#!/bin/sh
protected_branch='master'
current_branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "$protected_branch" == "$current_branch" ]; then
echo ".git/hooks: Do not commit to $current_branch branch"
exit 1
fi
在master分支上Commit时提示
#!/bin/sh
protected_branch='master'
current_branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "$protected_branch" == "$current_branch" ]; then
read -p "You're about to commit to master, is that what you intended? [y|n] " -n 1 -r </dev/tty
echo
if echo "$REPLY" | grep -E '^[Yy]$' >/dev/null; then
exit 0 # commit will execute
fi
exit 1 # commit will not execute
fi
禁止推送到master分支
#!/bin/sh
protected_branch='master'
remote_branch_prefix="refs/heads/"
protected_remote_branch=$remote_branch_prefix$protected_branch
while read local_ref local_sha remote_ref remote_sha
do
if [ "$protected_remote_branch" == "$remote_ref" ]; then
echo ".git/hooks: Do not commit to $protected_branch branch"
exit 1
fi
done
exit 0
推送到master分支时提示
#!/bin/sh
protected_branch='master'
remote_branch_prefix="refs/heads/"
protected_remote_branch=$remote_branch_prefix$protected_branch
while read local_ref local_sha remote_ref remote_sha
do
if [ "$protected_remote_branch" == "$remote_ref" ]; then
read -p "You're about to push master, is that what you intended? [y|n] " -n 1 -r < /dev/tty
echo
if echo $REPLY | grep -E '^[Yy]$' > /dev/null
then
exit 0 # push will execute
fi
exit 1 # push will not execute
fi
done
exit 0
为什么需要循环读取?因为git一次可以push多个分支
推送时如果commit消息包含WIP则禁止推送
#!/bin/sh
z40=0000000000000000000000000000000000000000
while read local_ref local_sha remote_ref remote_sha; do
if [ "$local_sha" = $z40 ]; then
# Handle delete
:
else
if [ "$remote_sha" = $z40 ]; then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
# Check for WIP commit
commit=$(git rev-list -n 1 --grep '^feat: WIP' "$range")
if [ -n "$commit" ]; then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0
这时候,你可能会发现,你每一次clone项目之后都需要手动把commit和push的hook文件丢在.git/hooks
目录下,是不是觉得不方便?别着急,有办法,我们可以让所有项目的hook操作统一到一个自定义目录中。
mkdir ~/.git-hooks # 创建一个存放hook的自定义目录
git config --global core.hooksPath ~/.git-hooks # 更改git配置指定hook目录到自定义,先别着急执行,往后看
这样就可以实现统一管理所有项目的hooks操作了
然后,你会觉得全局统一管理也太霸道了吧,比如说,公司的项目可以统一一套hooks操作,但是我不想把这一套hooks应用于个人github的项目啊。也就是说你需要在不同的目录下面执行不同的hooks操作,那么该怎么办呢?还是有办法:git配置是可以根据不同目录使用不同配置的
比如我只想统一管理~/yy
目录下的所有项目,那就修改~/.gitconfig
文件加入以下内容
[includeIf "gitdir:~/yy/"]
path = .gitconfig-yy
然后增加一个~/.gitconfig-yy
文件,在这个文件中加入yy目录下面的独有配置
[core]
hookspath = ~/.git-hooks
参考:
- https://stackoverflow.com/questions/42455506/in-pre-push-hook-get-git-push-command-full-content
- https://www.geek-share.com/detail/2776108340.html
- 使用sysbench压力测试MySQL(三)(r12笔记第6天)
- 解决IE响应式的解决方案css3-mediaqueries.js不生效问题
- MySQL传输表空间小结(r12笔记第2天)
- swingbench压测Oracle小记(r12笔记第20天)
- 分享最近对网站外链跳转页面代码的一些改善
- swingbench压测Oracle小记(r12笔记第19天)
- Oracle闪回原理测试(三)(r12笔记第16天)
- 利用JS生成二维码图片,优化WEB性能及页面加载速度
- Go语言的指针 & *
- MySQL中的double write(二)(r12笔记第17天)
- 论Go语言中goroutine的使用
- WordPress发布文章同步到新浪微博失败的问题解决与分享
- 压测工具swingbench和sysbench对比(r12笔记第13天)
- 解决WordPress4.4.1不支持图片暗箱问题,Begin主题适用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法