对于git hooks
大家往往第一时间想到的就是.git/hooks/
下的对应的git
生命周期的脚本。
在前端项目中,通过使用husky
来管理git hooks
是很常见的方案,在v5版本之前husky
恰恰是用的这种方式,在初始化脚本的时候会直接修改当前项目下.git/hooks/
下的对应的git
生命周期的脚本。但是从v5版本开始,使用者可以发现,husky
初始化以后会在项目文件夹创建一个默认名为.husky
目录,而对应的git hooks
控制脚本也在此目录下编写,而非.git/hooks/
下。
其核心代码如下:
// Create .husky/_
fs.mkdirSync(p.join(dir, '_'), { recursive: true })
// Create .husky/_/.gitignore
fs.writeFileSync(p.join(dir, '_/.gitignore'), '*')
// Copy husky.sh to .husky/_/husky.sh
fs.copyFileSync(p.join(__dirname, '../husky.sh'), p.join(dir, '_/husky.sh'))
// Configure repo
const { error } = git(['config', 'core.hooksPath', dir])
运行步骤
1、【创建hooks目录】上面提到v5的husky
自动创建.husky
目录收录git hooks
控制脚本,其目录地址其实是支持自定义的,可见【传送门】
2、【更新gitignore文件】创建好第一步的文件目录后会自动更新当前项目的.gitignore
文件设置其忽略
3、【拷贝增加husky.sh】这一步脚手架会将既定好的husky.sh
脚本拷贝的指定目录的_/
下,是husky
内置的支持通用的处理逻辑的脚本,有需要可以自行拓展,基本可以忽略。
4、【设置core.hookspath】主要是利用了git
的core.hookspath
这个配置项,在git
2.9
及以上版本则开始支持对应配置项【传送门】,其作用便是指定git hooks
的执行脚本目录。
npx husky add .husky/pre-commit "npm test"
运行步骤
1、判断对应hooks
文件是否存在
2、存在对应hooks
文件则追加对应脚本命令
2、不存在对应hooks
文件则创建对应文件然后写入对应脚本命令
其核心代码如下:
if (fs.existsSync(file)) {
fs.appendFileSync(file, `${cmd}\n`)
} else {
set(file, cmd) // 创建文件然后写入函数,不展开了就
}