git?hooks的作用及創(chuàng)建使用示例詳解
1. 什么是git hooks ?有什么用???
1.1 是個啥
git
大家都在用吧,相信現(xiàn)在沒公司代碼不做版本控制的吧。git hooks
是git
提供的,在發(fā)生特定事件時,允許用戶添加自定義代碼(或操作)的方式。
就像Vue
中組件的生命周期鉤子,比如,你想在vue
組件創(chuàng)建后輸出一行log
, 你可能會這么寫
export default { created () { console.log('Hello I am created.') } }
1.2 有啥用?我以前沒用過它不也一樣好好的嗎?我干嘛要用它?
- 你在git commit -m "feat: 修復(fù)bug=51234"時,總是提交的很規(guī)范,很明確自己提交了什么,但是團(tuán)隊中有人提交時只寫一個
git commit -m "add"
,你也看不出來他提交了啥,這時候就可以使用commit-msg
鉤子去限定下,提交信息必須符合某種格式,否則不允許提交 - 你喜歡
js
代碼縮進(jìn)用兩個空格,但是團(tuán)隊中有人總是兩個空格和四個空格混用,十分的混亂,這時候就可以結(jié)合eslint
,在提交前進(jìn)行代碼格式的校驗
2. 怎么創(chuàng)建一個 git hooks ?
2.1 首先看git hooks存在哪里
git hooks
其實就存在倉庫根目錄中的.git/hooks/
目錄中(.git目錄可能是隱藏目錄,取消隱藏即可查看),我們來看下默認(rèn)的.git/hooks/
目錄是什么樣子
發(fā)現(xiàn)了嗎,git
在初始化倉庫的時候,很貼心的為你初始化了很多個xxx.sample
文件(這些文件不會被執(zhí)行),就是鉤子的示例文件,比如pre-commit.sample
就是git commit
前的鉤子示例文件。
2.2 創(chuàng)建一個pre-commit鉤子
為了更容易理解,讓我們設(shè)定一個場景:比如,你想在git commit
前在命令行輸出一個 Hello world
在 .git/hooks/
中將pre-commit.sample
文件復(fù)制一份,刪除文件后綴名,文件名變?yōu)?code>pre-commit,刪除除第一行以外的內(nèi)容
#!/bin/sh # 以下為shell語法 echo "Hello world"
2.3 觸發(fā)鉤子
我們剛剛創(chuàng)建的是提交前的鉤子,那么我們要觸發(fā)它,就必須得提交代碼(即執(zhí)行git commit
)
在根目錄中創(chuàng)建一個文件 1.js
var a = 12
創(chuàng)建后目錄結(jié)構(gòu)
study ├── .git │ ├── hooks │ │ ├── pre-commit └── 1.js
添加進(jìn)暫存區(qū)
git add .
提交
git commit -m "我新建了一個1.js"
此時命令行輸出
你看上面打出了 "Hello world"
,喲呼,我們創(chuàng)建了自己的第一個git hooks
,給自己點(diǎn)個贊?。。?!
3 有用點(diǎn)的實戰(zhàn)
需求場景
假設(shè),我們不允許在提交信息中包含"大白"這種詞匯,那么我們可以怎么做?
在.git/hooks 中新建commit-msg文件, 編寫 .git/hooks/commit-msg 文件內(nèi)容
- node版
#!/usr/bin/env node const fs = require('fs'); // 索引 2 對應(yīng)的 commit 消息文件 里面包含提交信息 // 就是你在 git commit -m "msg" 時輸入的 msg const msg = fs.readFileSync(process.argv[2], 'utf-8').trim(); // 判斷 commit_msg中是否包含 "大白" // 若包含,則中斷git的流程 if (msg.indexOf('大白') > -1) { console.error('您的提交信息中包含【大白】這個詞匯,請檢查!'); // exit 1 表示程序執(zhí)行異常退出 中斷git的流程 不允許提交 process.exit(1); } else { console.log('不包含') }
- shell 版
#!/bin/sh # 獲取當(dāng)前提交的 commit msg 內(nèi)容 # 就是你在 git commit -m "msg" 時輸入的 msg # 用 `` 可以將命令的輸出結(jié)果賦值給變量 commit_msg # $1 是git在執(zhí)行鉤子時提供給我們的參數(shù),就是你在 git commit -m "msg" 時輸入的 msg commit_msg=`cat $1` # 輸出下獲取到的提交注釋 echo "您提交的commit_msg: $commit_msg" # 判斷 commit_msg中是否包含 "大白" # 若包含,則中斷git的流程 if [[ $commit_msg =~ "大白" ]] then echo "您的提交信息中包含【大白】這個詞匯,請檢查!" # exit 1 表示程序執(zhí)行異常退出 中斷git的流程 不允許提交 exit 1 else echo "不包含" fi
修改 1.js
var a = 12333
添加進(jìn)暫存區(qū)
git add .
提交
git commit -m "我新建了一個1.js,大白"
運(yùn)行結(jié)果
4 總結(jié)
其實就是git
就是在用戶做特定事情的時候,去查找.git/hooks/
,目錄中查找對應(yīng)事件的鉤子文件是否存在,若存在就執(zhí)行這個鉤子文件中的shell
腳本(上面的例子中就是git
在用戶執(zhí)行git commit
操作的時候,找到了pre-commit
文件并執(zhí)行了其中的shell
)
5 其他
5.1 如果在mac下報以下異常
hint: The ‘.git/hooks/pre-auto-gc’ hook was ignored because it’s not set as executable.
hint: You can disable this warning with git config advice.ignoredHook false.
那是因為在mac下文件默認(rèn)是不可執(zhí)行的,執(zhí)行以下操作即可
chmod 777 .git/hooks/commit-msg
5.2 常用鉤子
pre-commit 提交前 commit-msg 提交信息 pre-push push前
更多文檔請參看點(diǎn)我去官網(wǎng)看
5.3 hooks可以使用什么語言?
用于編寫 git hooks
的腳本語言是沒有限制的,你可以用 nodejs
、shell
、python
、ruby
等腳本語言,非常的靈活方便。文中我使用的是shell
以上就是git hooks的作用及創(chuàng)建使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于git hooks創(chuàng)建使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序 POST請求(網(wǎng)絡(luò)請求)詳解及實例代碼
這篇文章主要介紹了微信小程序 POST請求(網(wǎng)絡(luò)請求)詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11JS封裝轉(zhuǎn)換前后端接口數(shù)據(jù)格式工具函數(shù)下劃線<=>大寫
這篇文章主要為大家介紹了JS優(yōu)雅封裝轉(zhuǎn)換前后端接口數(shù)據(jù)格式工具函數(shù)下劃線<=>大寫實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03微信小程序 詳解頁面跳轉(zhuǎn)與返回并回傳數(shù)據(jù)
這篇文章主要介紹了微信小程序 詳解頁面跳轉(zhuǎn)與返回并回傳數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2017-02-02JS時間分片技術(shù)解決長任務(wù)導(dǎo)致的頁面卡頓
旨在把一個運(yùn)行時間比較長的任務(wù)分解成一塊一塊比較小的任務(wù),分塊去執(zhí)行,因為超過 50ms 的任務(wù)就會被認(rèn)為是 long task,用戶就能感知到渲染卡頓和交互的卡頓,所以我們可以縮短函數(shù)的連續(xù)執(zhí)行時間2022-07-07