不会写shell的程序员照样是好前端——用Node.JS实现git hooks

前言

git hooks想必很多攻城狮都不陌生,官方对于hooks有详细的文档,也有网友的文章Git Hooks (1):介绍,GIt Hooks (2):脚本分类,说的非常详细了,这里就不多做介绍,这里主要介绍一下如何写一个hook。

一个基本的git hook长什么样?

对git-hooks有一个入门认识的朋友都知道,hooks存放在git仓库的.git/hooks目录下,其中包括很多hooks,这些是在git 仓库创建的时候自动生成的,后缀名统一都是.sample,表示这些hooks都是默认不启用的,当把后缀名去掉之后,就变成了可以使用的hook。

举个栗子

pre-commit这个hook是在git commit的时候触发的hook,这个hook里面写了什么呢?代码我就不贴了,没啥劲,主要的几点就是:

  1. 这是一个shell脚本

  2. 这个脚本运行了一些东西然后退出了

  3. 退出的时候退出的错误码不是确定的

这就是一个hook的最基本的组成:在命令行执行git操作的时候,自动执行hooks目录下相应的可执行脚本,然后根据脚本的退出状态决定此次操作是否成功。当退出的错误码不为0的时候,表示失败,操作终止,否则操作继续。

模拟场景

如果现在有这样一个场景,在你的git仓库里,要求不允许提交dist目录,并且通过mocha的测试,否则不允许提交,用git hook 怎么做呢?

首先,这是在提交的时候的一个限制,所以应该考虑使用pre-commit这个hook,代码就不写了(不会写shell... Orz),整个过程如下:

  1. 检查是否有dist目录,如果没有的话下一步,否则退出,错误码置为1。

  2. 执行mocha命令进行测试,如果测试全部通过的话,退出,错误码为0,否则错误码为1,同样退出。

这样,当上述任何一步没有通过的时候,这个hook就会被终止,git-commit就无法通过,也就达到了限制提交的目的。

shell脚本的局限性——不会写

作为一名普通的前端,兼,一名不太合格的工程师,我对于shell脚本实在是不熟悉,连Linux命令都玩不转,别说写出666的shell脚本了,囧~ 所以要另辟巧径做这件事。

前端仔们对js应该是非常熟练的,所以如果能用js写hooks,那不就爽了?而Node.JS正好给了我们希望,感激涕零的话就不多说了,绝对感动到哭!

Node.js写起脚本来也非常简单,比如一个最简单的脚本


#!/usr/bin/env node

console.log('Hello World!');

给脚本赋予可执行权限之后就完全可以当做shell脚本来跑了,麻麻再也不用担心我不会shell了。同样的,在hooks中我们也可以这样用。再举个栗子

还是刚才的场景,不允许有dist目录,同时通过所有mocha测试,用Node就可以这样写(这次我能show出代码了)


#!/usr/bin/env node

var fs = require('fs'),

spawnSync = require('child_process').spawnSync;

if(fs.existsSync('./dist')){

console.log('Commit Abort!Please remove dist directory.');

process.exit(1);

}

// 使用同步方法spawnSync执行mocha,测试的结果在result.status中,通过为0,不通过为1

var result = spawnSync('./node_modules/.bin/mocha',['test']);

if(result.status){

console.log('Commit Abort!Test failure.');

}

process.exit(result.status);

这就是一个用Node.JS实现的基本的git-hook。

Node.JS的局限性——不能动

client-side hook的一个问题就是没法在随着仓库变动,如果项目成员多的话,每个人都需要在自己本地添加一次,hooks有变动了更新也比较麻烦。

解决方案

我个人对这个问题有一个简单解决方案,我做了一个仓库git-hooks-node,每次写好git hooks之后通过自己写的工具进行build,生成一个类似于安装器的文件,然后提交到远程仓库,如pre-commit.js是hook具体的内容,pre-commit.installer.js是生成的安装文件,也是一个脚本,github上的每一个文件都有相应的raw地址,如这个安装文件的地址为raw pre-commit.installer.js,然后mac OS下的用户就可以使用curl获取脚本并运行,如下:


curl https://raw.githubusercontent.com/y8n/git-hooks-node/master/xgfe-ma/pre-commit.installer.js | node

安装效果如下

这样只要写好一个hook并发布,项目成员只要知道地址就可以一键安转(想想还有点小激动呢)。这样虽然没有解决hook不会随着仓库移动的问题,但也提供了一种在项目组里通用一套hook的方案。

其他解决方法

husky是GitHub上一个开源项目,它的做法是在npm install这个模块的时候自动在.git/hooks目录下创建很多hooks,然后再在package.json中指定每一个hook的执行脚本,如下


"scripts": {

"precommit": "npm test",

"prepush": "npm test",

"commit-msg": "./validate-commit-msg.js",

"...": "..."

}

这样就可以把hooks随着项目变动,真正做到项目成员共用一个git hook,但问题就是必须在项目中依赖husky,不过想想这样的方法也比上面我的方法高明许多 -.-!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容