事情是这样的,最近组里新建了一个代码仓库来开发一个新的产品,再加上今天北京下大雨很多同事选择在家工作(包括我也是),于是我就选择用自己的个人电脑来工作。
但我的个人电脑里面的 Git 信息是用的我自己的个人邮箱:
git config --global user.name "Germey"
git config --global user.email "cqc@cuiqingcai.com"
复制代码
这两行命令大家用过 Git 的肯定都敲过对吧?
这个配置是全局生效的,所以如果我用 Git 的 commit 命令来提交代码的话,那么 commit 的名字和邮箱就会变成刚才我配置的个人信息。
然后如果把代码推送到公司的代码仓库里面,里面就会出现一个奇奇怪怪的用户名和头像,就像这样子:
图中上面两次 commit 就是我用个人电脑提交的,最后的那次 commit 是我上周在公司用公司电脑提交的。
这是不是很奇怪?
如果其他人也用的个人邮箱提交,那公司代码库里面就会出现各种怪怪的提交人的记录,无从知晓。
这肯定不能忍啊,以后要是有谁写了奇怪的代码都不好查是谁写的。
于是乎,我灵机一动,想:为何不在提交代码的时候做一个限制呢?
能做到吗?当然可以!
Git Hook
这里就介绍一个知识点 - Git Hook,它的意思就是在 Git 各种事件执行前和执行后执行一些自定义的逻辑,比如说,我们定义一个 pre-commit 的 Git Hook,那就能在 commit 之前执行一些操作,我们定义一个 post-push 的 Git Hook,那就能在 push 操作之后执行一些操作。
有关具体的内容可以参考官方文档:git-scm.com/book/en/v2/…
好,那这里我其实就是需要在 commit 之前做一下 Git 信息检查就好了,比如检查配置的邮箱不是工作邮箱,那就不允许执行 commit,所以就不会出现奇奇怪怪的 commit 记录了。
实操
说干就干。
配置 Git Hook 的工具有很多,Git 有原生支持,当然我们也可以用第三方库来做。
目前我们的代码仓库是基于 Node.js 开发的,所以 Node.js 的项目配置 Git Hook 比较流行的解决方案就是 husky,所以这里我也用 husky 来做了。
首先安装下 husky:
yarn add husky
复制代码
然后配置一个 Node.js 的 prepare 命令,这个命令可以在装完包 Node.js 包之后自动执行,所以 prepare 命令就配置成 husky 初始化的脚本,package.json 里面增加如下配置:
{
"scripts": {
...
"prepare": "npx husky install"
},
}
复制代码
OK,这样的话,其他人如果 clone 了这个仓库,装完所有 Node.js 包之后就会自动初始化 husky 的配置,然后在项目本地生成一个 .husky 的初始化目录,这样 Git Hook 就生效了。
Git Hook 生效之后,所有定义在 .husky 目录下的 Hook 脚本都会被应用,比如如果在 .husky 目录下添加一个 pre-commit 的脚本,那执行 commit 的之前,该脚本就会被预先执行做一些检查工作。
所以 .husky 目录下我就创建了一个 pre-commit 的脚本,写入了如下内容:
EMAIL=$(git config user.email)
if [[ ! $EMAIL =~ ^[.[:alnum:]]+@microsoft\.com$ ]];
then
echo "Your git information is not valid";
echo "Please run:"
echo ' git config --local user.name "<Your name in Microsoft>"'
echo ' git config --local user.email "<Your alias>@microsoft.com"'
exit 1;
fi;
复制代码
这是一个 Linux Shell 脚本,完全遵循 Shell 语法。
这里其实就是获取了 git config user.email
的返回结果,然后用正则表达式匹配是否符合公司邮箱格式,比如我们公司邮箱后缀当然是 microsoft.com 后缀,所以这里就用了 ^[.[:alnum:]]+@microsoft\.com$
来进行匹配了。这里值得注意的是,为什么这里没有用 \S
来代表非空白字符,而是用了一个 [:alnum]
呢?这是因为 Bash Shell 本身不支持 \S
这种匹配,所以这里得换成 [:alnum]
。
然后如果不匹配怎么办呢?
那就输出一些错误提示就好了,比如这里就提示请使用 git config —-local
命令来配置用户名和邮箱,之所以用-—local
是因为不想该配置影响全局的 Git 配置,所以这个配置只针对该仓库生效,然后 exit 1
就触发异常退出,程序运行终止,从而也不会触发 commit 命令了。
有了这个配置,我们来尝试下效果。
这会我没有做任何修改,Git 还是原来的配置,即我的全局个人邮箱配置。
这时候我执行下 commit 命令,就出现错误提示了:
Your git information is not valid
Please run:
git config --local user.name "<Your name in Microsoft>"
git config --local user.email "<alias>@microsoft.com"
复制代码
很棒!检测出来了。
按照这个提示说的,然后我运行下配置命令:
git config --global user.name "Qingcai Cui"
git config --global user.email "xxxx@microsoft.com"
复制代码
这里呢,我就配置了我的公司个人信息和公司邮箱。
然后重新再执行 commit 命令,就不会再出现如上的错误提示了!commit 成功!
大功告成!!!
有了它,我们就可以成功阻止一些奇奇怪怪的 commit 乱入公司的代码仓库了!
然后我把这个 PR 发出去了,有同事似乎也是深有感触,说道:
哈哈哈,有了这个,以后我们应该再也不会看到我们的代码仓库里面有 QQ 邮箱啦!
希望对大家有帮助~
创作不易,如果对大家有所帮助,希望大家点赞支持,有什么问题也可以在评论区里讨论