故事背景
在上一个项目组,团队强制要求使用git rebase
而不能使用gitmerge
。
新的团队虽然没有这个要求,但突然给代码增加了git提交验证
(在提交代码之前或之后进行检查,以确保提交符合特定的标准或规则)。
从代码规范来说,git提交验证是非常有必要的,但是我们这个项目很老了,经过很多人,突然增加git提交验证非常蛋疼!
以前的一些不规范代码,一些异常情况,难道还要我去修复兼容么?最难受的,我提交代码,node_modules还有代码兼容问题!
这让我如何容忍!于是二话不说,我使用--no-verify
跳过了git代码提交检查。
再介绍这个命令之前,我先介绍下git提交验证的一些基础知识。
Git Hooks
Git Hooks 是 Git 提供的一种机制,可以特定的事件发生时自动执行自定义脚本或命令,比如代码提交时,进行代码格式化、验证提交信息等。
常用的钩子函数有下面三个:
pre-commit
:在执行git commit
命令之前运行,可以用来检查代码风格、运行测试等。commit-msg
:在提交信息被输入后但提交被保存之前运行,可以用来验证提交信息的格式。pre-push
:在执行git push
之前运行,可以用来确保代码符合一定标准,或阻止推送不合适的代码。
通过再这些钩子里写入一些代码,就可以在git不同阶段做一些处理。
创建一个简单的 pre-commit
Hook
比如,我们可以写一个脚本,用于提醒开发者删除代码中的console.log
语句。
进入 .git/hooks
目录:
js
cd .git/hooks
创建 pre-commit
文件:
js
touch pre-commit
pre-commit
文件:
js
nano pre-commit
添加脚本(例如,检查代码中是否存在调试语句):
js
#!/bin/sh
if grep -r "console.log" .; then
echo "Error: Please remove all console.log statements before committing."
exit 1
fi
保存并退出,然后为脚本添加执行权限:
js
chmod +x pre-commit
现在,我们每次提交代码时,Git 会在提交前运行这个 pre-commit
脚本。如果脚本发现 console.log
语句,提交将被阻止,并显示错误信息。
使用工具管理 Git Hooks
从上面的代码我们可以看出,自定义git hooks是非常麻烦的,因此,我们可以使用一些git工具,它们可以简化 Git Hooks 的管理。
- Husky:一个流行的工具,可以将 Git Hooks 集成到项目中,并通过 npm 管理。适用于 JavaScript 项目。
- pre-commit:一个用于管理和共享 Git Hooks 的框架,支持多种语言。
这些工具可以让我们的 Git Hooks 配置变得很容易。
我们公司使用的就是Husky
提交代码时,pre-commit被执行,最终触发
npx lint-staged
lint-staged
是一个在提交代码时,仅对文件执行代码检查和格式化的工具,通常与Husky结合使用
本文就不介绍husky的使用了,感兴趣的大家可以自己百度。
如何绕开代码检查
想要绕开代码检查,最彻底的方法应该就是删除相关的检查代码了,比如我们公司使用的husky,删除它即可。
但,代码是公共的,删除文件显示不可行,这样肯定会被领导一顿臭骂!最简单的就是使用--no-verify
--no-verify
是 Git 提交命令中的一个选项,用于跳过 Git Hooks 的执行。使用这个选项时,Git 将不会运行与提交相关的 Hook,例如 pre-commit
、commit-msg
或 pre-push
。
比如
跳过 pre-commit
和 commit-msg
Hooks:
js
git commit -m "嘿嘿,我要跳过检查" --no-verify
跳过 pre-push
Hook:
js
git push --no-verify
我用来解决我项目中遇到的问题试试:
加了--no-verify效果显著啊!
注意:
--no-verify
没有简写;在日常开发中不建议频繁使用,跳过验证可能会导致不符合标准的代码进入代码库,或提交信息不符合团队规范(废话啊,用的时候一定是被迫的)。
总结
本文简单介绍了Git Hooks的一些基础知识,同时,最重要的介绍了跳过git提交检查的指令,就一句代码:
js
git commit -m "嘿嘿,我要跳过检查" --no-verify