摘要:當(dāng)退出的錯(cuò)誤碼不為的時(shí)候,表示失敗,操作終止,否則操作繼續(xù)。執(zhí)行命令進(jìn)行測試,如果測試全部通過的話,退出,錯(cuò)誤碼為,否則錯(cuò)誤碼為,同樣退出。這樣雖然沒有解決不會隨著倉庫移動(dòng)的問題,但也提供了一種在項(xiàng)目組里通用一套的方案。
git hooks想必很多攻城獅都不陌生,官方對于hooks有詳細(xì)的文檔,也有站內(nèi)網(wǎng)友的文章Git Hooks (1):介紹,GIt Hooks (2):腳本分類,說的非常詳細(xì)了,這里就不多做介紹,這里主要介紹一下如何寫一個(gè)hook。
一個(gè)基本的git hook長什么樣?對git-hooks有一個(gè)入門認(rèn)識的朋友都知道,hooks存放在git倉庫的.git/hooks目錄下,其中包括很多hooks,這些是在git 倉庫創(chuàng)建的時(shí)候自動(dòng)生成的,后綴名統(tǒng)一都是.sample,表示這些hooks都是默認(rèn)不啟用的,當(dāng)把后綴名去掉之后,就變成了可以使用的hook。
舉個(gè)栗子pre-commit這個(gè)hook是在git commit的時(shí)候觸發(fā)的hook,這個(gè)hook里面寫了什么呢?代碼我就不貼了,沒啥勁,主要的幾點(diǎn)就是:
這是一個(gè)shell腳本
這個(gè)腳本運(yùn)行了一些東西然后退出了
退出的時(shí)候退出的錯(cuò)誤碼不是確定的
這就是一個(gè)hook的最基本的組成:在命令行執(zhí)行g(shù)it操作的時(shí)候,自動(dòng)執(zhí)行hooks目錄下相應(yīng)的可執(zhí)行腳本,然后根據(jù)腳本的退出狀態(tài)決定此次操作是否成功。當(dāng)退出的錯(cuò)誤碼不為0的時(shí)候,表示失敗,操作終止,否則操作繼續(xù)。
模擬場景如果現(xiàn)在有這樣一個(gè)場景,在你的git倉庫里,要求不允許提交dist目錄,并且通過mocha的測試,否則不允許提交,用git hook 怎么做呢?
首先,這是在提交的時(shí)候的一個(gè)限制,所以應(yīng)該考慮使用pre-commit這個(gè)hook,代碼就不寫了(不會寫shell... Orz),整個(gè)過程如下:
檢查是否有dist目錄,如果沒有的話下一步,否則退出,錯(cuò)誤碼置為1。
執(zhí)行mocha命令進(jìn)行測試,如果測試全部通過的話,退出,錯(cuò)誤碼為0,否則錯(cuò)誤碼為1,同樣退出。
這樣,當(dāng)上述任何一步?jīng)]有通過的時(shí)候,這個(gè)hook就會被終止,git-commit就無法通過,也就達(dá)到了限制提交的目的。
shell腳本的局限性——不會寫作為一名普通的前端,兼,一名不太合格的工程師,我對于shell腳本實(shí)在是不熟悉,連Linux命令都玩不轉(zhuǎn),別說寫出666的shell腳本了,囧~ 所以要另辟巧徑做這件事。
前端仔們對js應(yīng)該是非常熟練的,所以如果能用js寫hooks,那不就爽了?而Node.JS正好給了我們希望,感激涕零的話就不多說了,絕對感動(dòng)到哭!
Node.js寫起腳本來也非常簡單,比如一個(gè)最簡單的腳本
#!/usr/bin/env node console.log("Hello World!");
給腳本賦予可執(zhí)行權(quán)限之后就完全可以當(dāng)做shell腳本來跑了,麻麻再也不用擔(dān)心我不會shell了。同樣的,在hooks中我們也可以這樣用。再舉個(gè)栗子
還是剛才的場景,不允許有dist目錄,同時(shí)通過所有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執(zhí)行mocha,測試的結(jié)果在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);
這就是一個(gè)用Node.JS實(shí)現(xiàn)的基本的git-hook。
Node.JS的局限性——不能動(dòng)client-side hook的一個(gè)問題就是沒法在隨著倉庫變動(dòng),如果項(xiàng)目成員多的話,每個(gè)人都需要在自己本地添加一次,hooks有變動(dòng)了更新也比較麻煩。
解決方案我個(gè)人對這個(gè)問題有一個(gè)簡單解決方案,我做了一個(gè)倉庫git-hooks-node,每次寫好git hooks之后通過自己寫的工具進(jìn)行build,生成一個(gè)類似于安裝器的文件,然后提交到遠(yuǎn)程倉庫,如pre-commit.js是hook具體的內(nèi)容,pre-commit.installer.js是生成的安裝文件,也是一個(gè)腳本,github上的每一個(gè)文件都有相應(yīng)的raw地址,如這個(gè)安裝文件的地址為raw pre-commit.installer.js,然后mac OS下的用戶就可以使用curl獲取腳本并運(yùn)行,如下:
curl https://raw.githubusercontent.com/y8n/git-hooks-node/master/xgfe-ma/pre-commit.installer.js | node
安裝效果如下
這樣只要寫好一個(gè)hook并發(fā)布,項(xiàng)目成員只要知道地址就可以一鍵安轉(zhuǎn)(想想還有點(diǎn)小激動(dòng)呢)。這樣雖然沒有解決hook不會隨著倉庫移動(dòng)的問題,但也提供了一種在項(xiàng)目組里通用一套hook的方案。
其他解決方法husky是GitHub上一個(gè)開源項(xiàng)目,它的做法是在npm install這個(gè)模塊的時(shí)候自動(dòng)在.git/hooks目錄下創(chuàng)建很多hooks,然后再在package.json中指定每一個(gè)hook的執(zhí)行腳本,如下
"scripts": { "precommit": "npm test", "prepush": "npm test", "commit-msg": "./validate-commit-msg.js", "...": "..." }
這樣就可以把hooks隨著項(xiàng)目變動(dòng),真正做到項(xiàng)目成員共用一個(gè)git hook,但問題就是必須在項(xiàng)目中依賴husky,不過想想這樣的方法也比上面我的方法高明許多 -.-!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79172.html
摘要:例如提供的用于修改的鉤子就需要在的同時(shí)從遠(yuǎn)程服務(wù)器下載到本地來替換,代碼如下這當(dāng)然是一種好方式。安裝簡單到看完配置就懂了吧,直接在中增加這一項(xiàng),并直接把想執(zhí)行的語句寫在里面即可。在前端的日常工作中,經(jīng)常會出現(xiàn)當(dāng)執(zhí)行一種操作之前(之后)需要同時(shí)執(zhí)行另一種操作的情況,比如我們希望在每次git commit之前都運(yùn)行eslint代碼檢查、npm install之前檢查項(xiàng)目依賴等。作為經(jīng)典的情況,各...
原文鏈接 隨著Vateral主題的開發(fā)接近了尾聲,在對主題速度優(yōu)化的時(shí)候發(fā)現(xiàn)之前用的githubpage問題多多:首先就是因?yàn)樵趪鴥?nèi)的原因,訪問速度本身就很慢,曾經(jīng)有次加載一張16kb的圖標(biāo)時(shí)間耗費(fèi)了26s!!?其次,在對資源做CDN托管加速時(shí),域名是需要備案的,顯然githubpage也是做不了的;所以果斷舍棄了這個(gè)把hexo搭建到了我的阿里云服務(wù)器上 總體來說還是比把hexo搭建到github...
摘要:一切看似妥當(dāng),但是頻繁的調(diào)整以及部署自然成了頭疼的問題。叫作部署的大問題由于我比較菜,所以沒有寫測試模塊。為什么因?yàn)榻^大多數(shù)都是黨用來部署的啊。。。經(jīng)過思考,原來在這里我們需要將部署工序做一個(gè)調(diào)整,同時(shí)增加步。。。 前言 在自己的vps上做博客系統(tǒng)已經(jīng)有一段時(shí)間了,期間也是磕磕碰碰遇到不少問題,如今也算是有個(gè)基礎(chǔ)版本能用。可是vps上只放一個(gè)博客有點(diǎn)浪費(fèi)了,而且博客系統(tǒng)也不光是用來寫文...
摘要:當(dāng)我嘗試為招一個(gè)程序員時(shí),我發(fā)現(xiàn)這項(xiàng)任務(wù)相當(dāng)艱巨。我承諾給其中一位侯選人一輛凱迪拉克,但最終沒有打動(dòng)他。你會得到一輛年的凱迪拉克作為簽約的報(bào)酬。大神是一名還不存在的產(chǎn)品的前端工程師。 周五,2010年8月13號, 作者:anutron 編者注: 這篇文章寫于2010年作者工作在Cloudera期間,當(dāng)時(shí)node.js還沒有流行,很多人還瞧不上javascript這門簡陋的腳本,文章提...
閱讀 2293·2021-11-25 09:43
閱讀 3446·2021-10-25 09:48
閱讀 1321·2021-09-13 10:24
閱讀 2734·2019-08-29 15:07
閱讀 1258·2019-08-29 13:14
閱讀 3265·2019-08-29 12:22
閱讀 1354·2019-08-29 11:32
閱讀 3229·2019-08-29 11:23