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