你提交代碼前沒有校驗?巧用gitHooks解決

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信?ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。已進行四個月了,很多小伙伴表示收獲頗豐。

想學源碼,極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。同時推薦參與源碼共讀活動。


感謝bigAken投稿

在每一個使用 git 進行版本管理的倉庫,都有一個目錄 .git/hooks,包含 commit 各個階段 Hooks 的腳本。這些 Hooks 在 git 操作 commit、push、merge 等得時候,可以做前置或者后置的操作,例如 pre-commit 在 git commit 前可以做代碼校驗,校驗代碼的時候使用的ESLint,格式化使用的是 prettier。Git 支持的常用鉤子見下表,更多請查看官網Hooks:

Git Hook調用時機調用時機
pre-commitgit commit 執行前可以用 git commit --no-verify 繞過
commit-msggit commit 執行前可以用 git commit --no-verify 繞過
pre-merge-commitgit merge 執行前可以用 git merge --no-verify 繞過
pre-pushgit push 執行前

本文先實踐,怎么去寫 pre-commit 這個 git hooks,然后介紹 husky,lint-staged,commitlint 的使用

在 git 項目中,.git/hooks下面有很多 hooks 示例如下dfb6f175b7b7a524f4c22eb8977b6c4e.png

這些 git hooks 都是.sample結尾的,如果要啟用某個 hooks 用可以去掉.sample結尾

實踐

npm init -y初始化一個項目,然后git init,然后npm install eslint --save-dev

新建.gitignore文件

node_modules#?local?env?files
.env.local
.env.*.local#?Log?files
npm-debug.log*
yarn-debug.log*
yarn-error.log**-lock.json
*.lock

新建.eslintrc,配置 eslint

{"rules":?{//?要求使用分號"semi":?["error",?"always"],//?強制使用一致的反勾號、雙引號或單引號"quotes":?["error",?"double"]}
}

新建src目錄,然后里面新建index.js,禁止使用快捷鍵格式化

console.log('object')

根目錄新建文件夾.customGitHooks然后 git config 'core.hooksPath' .customGitHooks,主要是設置 gitHooks 的存放目錄,因為 gitHooks 默認存放目錄是.git/hooks,新建pre-commit,寫入如下

#!/bin/shecho?'start?check?your?code,please?wait...'
#?git?diff?獲取更改的內容?可以通過參數--diff-filter?配置條件
npx?eslint?$(git?diff?--cached?--name-only?--diff-filter=ACM?--?'*.js')
#?變量$?--->上一個命令的執行狀態結果
if?[?$??!=?'0'?];thenecho?"ending and failed,please check your code;"exit?1
elseecho?"check?pass"
fi

這時候,執行git add .git commit -m 'test'就會發現沒有 commit 成功,報錯了,如下圖577a082c19fb3ec455a10d18ef6238c0.png

如果把 index.js 的代碼修改如下:

console.log('object')

執行git add .git commit -m 'test'就會發現 eslint 代碼檢查通過了,能正常提交了,以上實踐能很好解釋 commit 前怎么檢驗代碼,但是有個缺點就是別人 pull 你的代碼要執行git config 'core.hooksPath' .customGitHooks能起作用;下面就介紹 husky,lint-staged,commitlint 的使用

.git 文件夾不會被跟蹤并且上傳至遠程倉庫的

Husky

github為了解決.git配置不能提交遠程倉庫的問題,husky 出來了,husky 在你npm i安裝完依賴只有自動執行husky install

安裝 npm install husky -D

npm?install?husky?-D

使用

編輯package.jsonscript里添加prepare的值為husky install

"scripts":?{"prepare":"husky?install"},

然后執行npm run prepare,做了什么事呢

源碼index.ts中,我們看到執行 husky install 實際上就是創建 .husky 目錄,復制../husky.sh文件到該目錄下,配置了一個.gitignore,設置了core.hooksPath(設置 .husky 目錄為 git hooks 目錄)

添加一個 hook

.husky目錄下創建pre-commit

#!/bin/shecho?'start?check?your?code,please?wait...'
#?git?diff?獲取更改的內容?可以通過參數--diff-filter?配置條件
npx?eslint?$(git?diff?--cached?--name-only?--diff-filter=ACM?--?'*.js')
#?變量$?--->上一個命令的執行狀態結果
if?[?$??!=?'0'?];thenecho?"ending and failed,please check your code;"exit?1
elseecho?"check?pass"
fi

index.js文件內容如下

console.log('object')

然后執行git add .git commit -m 'test'發現代碼已經被攔截,沒有提交,因為index.js代碼不符合規范

遺留問題就是 git hooks 不會編寫怎么辦,下面 lint-staged 出來了

lint-staged

配置例子作用:對 Git 暫存區代碼文件進行 bash 命令操作等等

npm?i?lint-staged?-D

根目錄下新建.lintstagedrc文件

{"*.js":?"eslint"
}

husky目錄下的pre-commit修改如下

.?"$(dirname?"$0")/_/husky.sh"
npm?run?lint

package.json添加script

"scripts":?{"lint":?"lint-staged"
}

index.js如下

console.log('object')
console.log('object')

執行git add .git commit -m 'test',可以發現調用了 eslint 去檢查代碼,檢查不通過就退出commit

f4e1947874eeb22174ea8ec975778198.png

綜上,代碼檢測規范有了,現在也需要規范一下提交規范;

commitlint

github

校驗 commit 提交的信息

npm install --save-dev @commitlint/config-conventional @commitlint/cli

使用新建commitlint.config.js

module.exports?=?{extends:?['@commitlint/config-conventional'],rules:?{'type-enum':?[2,?'always',?['build',?'ci',?'docs',?'feat',?'fix',?'perf',?'refactor',?'style',?'test',?'revert',?'chore']],'type-case':?[0],'type-empty':?[0],'scope-empty':?[0],'scope-case':?[0],'subject-full-stop':?[0,?'never'],'subject-case':?[0,?'never'],'header-max-length':?[0,?'always',?72]}
}

配置git hooks,執行下面命令

npx?husky?add?.husky/commit-msg?'npx?--no?--?commitlint?--edit?$1'

commit message 一般分為三個部分 Header,Body 和 Footer

header
<type>(<scope>):?<subject>
//?空一行
<body>
//?空一行
<footer>
其中,Header?是必需的,Body?和?Footer?可以省略

接下來提交的 commit 必須符合下面的格式

注意冒號后面有空格

git commit -m <type>[optional scope]: <description>

常用的 type 類別

  • build:主要目的是修改項目構建系統(例如 glup,webpack,rollup 的配置等)的提交

  • ci:主要目的是修改項目繼續集成流程(例如 Travis,Jenkins,GitLab CI,Circle 等)的提交

  • docs:文檔更新

  • feat:新增功能

  • fix:bug 修復

  • perf:性能優化

  • refactor:重構代碼(既沒有新增功能,也沒有修復 bug)

  • style:不影響程序邏輯的代碼修改(修改空白字符,補全缺失的分號等)

  • test:新增測試用例或是更新現有測試

  • revert:回滾某個更早之前的提交

  • chore:不屬于以上類型的其他類型(日常事務)

optional scope:一個可選的修改范圍。用于標識此次提交主要涉及到代碼中哪個模塊。

description:一句話描述此次提交的主要內容,做到言簡意賅。

這時候,執行一次測試一下

git?add?.
git?commit?-m?'test'

因為該提交的 commit 是不規范的所以提交時失敗的 如下圖

a376278039a01def73d8a1d5e0fae66c.png

如果把 commit 修改,就會提交成功,因為符合 commit 規范

git?add?.
git?commit?-m?'feat:?test'
499a2b1478fc1410131b0703ffd3d4be.png

但是問題又來了,每次 commit 都要輸入,有點不方便;而且有可能輸錯 下面就介紹到 commitizen

commitizen

cz-commitlint

生成符合規范的 commit message

本地安裝并沒有全局安裝,當然可以全局安裝具體查看官方文檔,全局安裝可以使用git czcz-commitlint打通 commitizencommitlint配置

npm?install?--save-dev?@commitlint/cz-commitlint?commitizen

然后

npx?commitizen?init?cz-conventional-changelog?--save-dev?--save-exact

package.json添加script

{"scripts":?{"commit":?"git-cz"},"config":?{"commitizen":?{"path":?"@commitlint/cz-commitlint"}}
}

新建commitlint.config.js

module.exports?=?{extends:?['@commitlint/config-conventional']
}

然后執行

git?add?.
npm?run?commit

發現為中文提示如下圖abd2700ae61d5bf3d5e26dfc99449682.png

再次修改commitlint.config.js

module.exports?=?{extends:?['@commitlint/config-conventional'],prompt:?{questions:?{type:?{description:?'選擇你要提交的類型:',enum:?{feat:?{description:?'新功能',title:?'Features',emoji:?'?'},fix:?{description:?'修復相關bug',title:?'Bug?Fixes',emoji:?'🐛'},docs:?{description:?'文檔更改',title:?'Documentation',emoji:?'📚'}}}}}
}

然后執行

git?add?.
npm?run?commit

可以看到變成中文了,具體參考官網96115f99ab69e0f2cb88d22e809272fe.png

接下來提交信息 執行npm run commit,就可以按照規范提交了;如果沒有使用commitlint,在 commitizen中使用 cz-customizable也可以自定義很多配置的

最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進群。

推薦閱讀

整整4個月了,盡全力組織了源碼共讀活動~
我歷時3年才寫了10余篇源碼文章,但收獲了100w+閱讀

老姚淺談:怎么學JavaScript?

我在阿里招前端,該怎么幫你(可進面試群)

f1323ebe0a521147f9b2bfd6ceadfa02.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》10余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助1000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

ea0c7e4b9ef8fd45daf370c1e0f1f552.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux下自動化測試環境的搭建

1.安裝Linux虛擬機&#xff0c;詳情參考 https://blog.csdn.net/qq_22770715/article/details/78558374 https://www.cnblogs.com/Q277227/p/8176564.html 1.1 需要確定IP &#xff0c;使用 ifconfig 1.2 linux的用戶名跟密碼&#xff1b; 1.3 確定可以遠程ssh登錄&…

code craft_以Craft.io為先—關于我們行業的實踐職業道路的系列

code craft重點 (Top highlight)For the past two decades, digital product design / UX has been shifting to become a more strategic discipline within organizations. Partially because business leaders have started to pay attention to how design-driven companie…

Nginx+httpd反代實現動靜分離

什么是動靜分離為了提高網站的響應速度&#xff0c;減輕程序服務器&#xff08;apachephp&#xff0c;nginxphp等&#xff09;的負載&#xff0c;對于靜態資源比如圖片&#xff0c;js&#xff0c;css&#xff0c;html等靜態文件&#xff0c;我們可以在反向代理服務器中設置&…

(建議收藏)前端面試必問的十六條HTTP網絡知識體系

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行四個月了&#xff0c;很多小伙伴表示收獲頗豐。想學源碼&#xff0c;極力推薦訂閱我寫的《學習…

了解 DB2 Version 9.5 中的全局變量(轉)

轉自&#xff1a;http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0711zubiri/ 簡介 在關系數據庫系統內部&#xff0c;應用程序和實際數據庫之間的主要交互都是以會話或連接的 SQL 語句形式來實現的。過去&#xff0c;為了在相同會話中實現不同 SQL 語句之…

jQuery新版本加載json注意事項。

jQuery在1.4版本后&#xff0c;采用了更為嚴格的json解析方式&#xff0c;所以所有內容都必須要有雙引號。比如以前{key:”28CATEGORY”,status:”0″}是沒問題的。但升級成1.4后&#xff0c;都必須加上雙引號&#xff1a;{“key” : “28CATEGORY”,“status” : “0″}如果你…

多邊形的時針方向與法線方向

從相反的法線方向觀察&#xff0c;順時針還是逆時針是相反的。 多邊形的時針方向與法線方向的關系呈右手法則關系。 GoogleEarth中的面具有時針方向&#xff0c;法線方向為正向&#xff0c;反之為負向 GoogleEarth的垂面在法線方向為亮色&#xff0c;反向為暗色 GoogleEarth的水…

裂墻推薦!再也不用求后端給接口了...

大家好&#xff0c;我是若川。今天咱們來介紹一款強大的云服務平臺&#xff01;MemFire Cloud注冊即享5GB存儲空間、每月100萬讀額度和每月10萬寫額度。平臺入口&#xff1a;https://memfiredb.com/今天&#xff08;12月10號&#xff09;還有限時的送書活動&#xff01;感興趣的…

1.今日標簽:視頻價值一千字

I love the App Store. It looks and works better than ever. But also, I love tricky design challenges. How do you improve something that already works great?我喜歡App Store。 它的外觀和工作比以往更好。 但是我也很棘手 設計挑戰。 您如何改善已經很好的工作&a…

Android service 小研究

最近同學搞起了Android開發&#xff0c;自己也撿起來這個玩意來看看。這里先研究一下service Service是安卓系統提供的四種組件之一&#xff0c;功能與activity類似&#xff0c;只不過沒有activity 的使用頻率高。顧名思義Service就是運行在后臺的一種服務程序一般很少與用戶交…

螞蟻金服瘋了嗎?大動作,非裁員,年底全員漲薪又漲假期!!!

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。以下分享一篇水文&#…

Android工程師轉型Java后端開發之路,自己選的路,跪著也要走下去!

本文是公眾號讀者jianfeng投稿的面試經驗恭喜該同學成功轉型目錄&#xff1a;毅然轉型&#xff0c;沒頭蒼蠅制定目標&#xff0c;系統學習面試經歷毅然轉崗&#xff0c;沒頭蒼蠅首先&#xff0c;介紹一下我的背景。本人坐標廣州&#xff0c;2016年畢業于一個普通二本大學&#…

書呆子rico_尋找設計和類型書呆子的清道夫

書呆子ricoI studied graphic design at an art school where typography was a core focus. I took 3 levels of typography classes and nearly lost my mind! But even before I studied type, I had a soft spot for signage. It’s one of the themes I enjoy shooting mo…

Regsvr32 dll OCX時報錯,LoadLibrary(Dllname) 內存訪問失敗。

解決辦法&#xff1a; 把要注冊的DLL或者OCX文件COPY到C盤根目錄&#xff0c;運用命令提示符工具&#xff0c;進入C盤根目錄&#xff0c;再運行Regsvr32 DLLname.dll即可。 轉載于:https://www.cnblogs.com/BrianLee/archive/2011/12/04/2275425.html

WebStorm 和 VsCode 的結合體來了!

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。周末分享下簡單的文章~每…

從零開始學Node.js(八_刪查)

node.js的事件 Node.js 是單進程單線程應用程序&#xff0c;但是因為 V8 引擎提供的異步執行回調接口&#xff0c;通過這些接口可以處理大量的并發&#xff0c;所以性能非常高。Node.js 幾乎每一個 API 都是支持回調函數的。Node.js 基本上所有的事件機制都是用設計模式中觀察者…

設計的概念以及含義_什么是設計概念? 以及為什么您應該始終從一個開始

設計的概念以及含義We work on designs almost every day, and we use different design methods to make the design usable, aesthetically appealing, and likable. But, many times, those well-crafted designs fail to reach a level to become market differentiator or…

C# 與java區別總結 收集

節選自《C、Java/C#之比較》http://dev.firnow.com/course/3_program/c/cppsl/2008520/117228.html 使用指針&#xff0c;由程序員根據需要分配、訪問內存&#xff0c;程序運行時動作明確直接沒有額外的處理步驟&#xff0c;程序的執行效率就高&#xff0c;但若程序員忘了釋放內…

碎片化學習前端資料分享~

大前端學習&#xff0c;關注這幾個大佬就夠了。他們的文章提供的大前端知識非常完備&#xff0c;也經常推薦大前端面試、個人成長相關的文章&#xff0c;對于你來說&#xff0c;學大前端&#xff0c;關注這些公眾號就夠了。不多說&#xff0c;直接看這些大佬的介紹。&#x1f3…

1、類型和語法——類型

類型&#xff1a;值的內部特征&#xff0c;定義了值的行為&#xff0c;以使其區別于其他值1.1 類型事關強制類型轉換1.2 內置類型七種除對象外&#xff0c;其他統稱為“基本類型”函數是 Object 的一個字類型&#xff08;可調用對象&#xff09;數組也是一個“子類型“1.3 值和…