(三) git pre-push hook 實(shí)踐一二

??在 (一) 初探 iOS 單元測試 一文中悠轩,我們簡單提到了執(zhí)行xcodebuild test可以啟動工程的單元測試并輸出測試結(jié)果试浙,但手動執(zhí)行此類命令意義是不大的族吻。我們需要的是暴心,把一些測試和lint等命令寫在腳本文件里辽旋,在代碼提交浩嫌、合并及打包等行為實(shí)際發(fā)生前,自動執(zhí)行腳本补胚,以執(zhí)行的結(jié)果決定是否打斷上述操作码耐,一定程度上達(dá)到控制代碼質(zhì)量的目的。
??在多人協(xié)作開發(fā)中溶其,我們可以在所有成員進(jìn)行某些git操作(commit push merge rebase等)前進(jìn)行代碼的驗證(Test骚腥、Lint等),防止邏輯錯誤或不合規(guī)范的代碼更新到遠(yuǎn)端倉庫中瓶逃。當(dāng)然束铭,如果團(tuán)隊搭建了自己的git服務(wù)器,有Mac服務(wù)器厢绝,在server端進(jìn)行g(shù)it hooks是最好的解決方案契沫,本地倉庫也不用進(jìn)行額外配置。此外昔汉,我們也可以做一些Client Hooks懈万,來達(dá)到同樣的效果。以下內(nèi)容是筆者對git pre-push hook的一些實(shí)踐挤庇。

手動添加pre-push文件

前往本地倉庫钞速,按下command+shift+.查看隱藏文件,目錄如下嫡秕。我們可以看到.git/hooks路徑下有一些.sample的文件渴语。


.git/hooks

刪除pre-push.sample文件的后綴名,用編輯器打開昆咽,寫入:

exit 1

保存退出驾凶,倉庫根目錄下牙甫,執(zhí)行:

git push
push log

可以看到push失敗。下面我們在pre-push寫入單元測試的命令调违,如果測試通過窟哺,pre-push程序正常退出,push成功技肩;測試失敗且轨,出錯并退出,push失敗虚婿。寫入:

workspace_name() {
  workspace_file=`find . -maxdepth 2 -name *.xcworkspace -exec basename {} \;`
  echo ${workspace_file%.xcworkspace}
}

check_result() {
if [ $? != 0 ]; then
echo "$1 failed!!"
echo "push will not execute"
echo "$?"
exit 1
else
echo "$1 passed."
echo "push will execute"
echo "$?"
fi
}

workspace=$(workspace_name)

xcodebuild -workspace Example/$workspace.xcworkspace -scheme $workspace-Example -destination 'platform=iOS Simulator,OS=11.0,name=iPhone 7' test
check_result "test"

例子是以pod lib create ...創(chuàng)建的標(biāo)準(zhǔn)工作空間旋奢,從倉庫根目錄起以最大深度為2尋找以.xcworkspace結(jié)尾的文件名,賦給workspace變量然痊,最后test名為worksapce.xcworkspace scheme為worksapce-Example的工程至朗,測試失敗,打印"push will not execute"剧浸,exit 1锹引;反之打印push will executeexit 0唆香。 倉庫根目錄下執(zhí)行:

git push

最后輸出:


測試失敗嫌变,push失敗
測試通過,push成功

現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了一些我們想要的效果袋马,但如何讓團(tuán)隊里的每個開發(fā)成員都收到pre-push hook的規(guī)范呢初澎?

自動添加pre-push文件

我們知道,.git文件夾并不會被push到遠(yuǎn)程倉庫虑凛,每個成員clone倉庫碑宴,.git文件夾是會初始化的。也就是說桑谍,正常情況下延柠,pre-push hook只對個人有效。但我們可以耍一些小手段锣披,讓每個成員倉庫.git/hooks路徑下都存在我們寫好的pre-push文件贞间,這樣其他成員的倉庫也具備了git pre-push hook功能。

if [ ! -d "$../.git/hooks/pre-push" ]; then
cp ../pre-push ../.git/hooks/pre-push
exit 0
fi

首先雹仿,我們寫好一個腳本增热,功能為如果.git/hooks路徑下沒有pre-push文件,就復(fù)制一個進(jìn)去胧辽。如圖中add-pre-push-hook.sh文件:


add-pre-push-hook.sh

那這個腳本在什么時候被執(zhí)行呢峻仇?答案是放在我們Target的Run Script下:


Run Script

??注意Run Script 和 add-pre-push-hook.sh 是在.xcodeproj的路徑下開始執(zhí)行的。這樣邑商,每當(dāng)build摄咆,就會執(zhí)行add-pre-push-hook.sh檢查.git/hooks文件夾下是否存在pre-push文件并嘗試復(fù)制進(jìn)去凡蚜。下次當(dāng)開發(fā)成員嘗試push代碼時,便無形中受到了hook?源印3!這一切對很多工程的基礎(chǔ)庫的維護(hù)做代碼檢查還是有一定實(shí)用價值的涩金。

謝謝觀看谱醇!歡迎指出文中錯誤!

參考文檔

https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/
http://blog.ricardofilipe.com/post/git-hook-push-master

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末步做,一起剝皮案震驚了整個濱河市枣抱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辆床,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桅狠,死亡現(xiàn)場離奇詭異讼载,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)中跌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門咨堤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漩符,你說我怎么就攤上這事一喘。” “怎么了嗜暴?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵凸克,是天一觀的道長。 經(jīng)常有香客問我闷沥,道長萎战,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任舆逃,我火速辦了婚禮蚂维,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘路狮。我一直安慰自己虫啥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布奄妨。 她就那樣靜靜地躺著涂籽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪展蒂。 梳的紋絲不亂的頭發(fā)上又活,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天苔咪,我揣著相機(jī)與錄音,去河邊找鬼柳骄。 笑死团赏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耐薯。 我是一名探鬼主播舔清,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曲初!你這毒婦竟也來了体谒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤臼婆,失蹤者是張志新(化名)和其女友劉穎抒痒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颁褂,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡故响,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颁独。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩届。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖誓酒,靈堂內(nèi)的尸體忽然破棺而出樟蠕,到底是詐尸還是另有隱情,我是刑警寧澤靠柑,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布寨辩,位于F島的核電站,受9級特大地震影響病往,放射性物質(zhì)發(fā)生泄漏捣染。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一停巷、第九天 我趴在偏房一處隱蔽的房頂上張望耍攘。 院中可真熱鬧,春花似錦畔勤、人聲如沸蕾各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽式曲。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吝羞,已是汗流浹背兰伤。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钧排,地道東北人敦腔。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像恨溜,于是被迫代替她去往敵國和親符衔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理糟袁,服務(wù)發(fā)現(xiàn)判族,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 1.什么是 Git Hooks 如同其他許多的版本控制系統(tǒng)一樣项戴,Git 也具有在特定事件發(fā)生之前或之后執(zhí)行特定腳本...
    就叫yang閱讀 3,251評論 3 11
  • 什么是Git Hooks形帮? 話說,如同其他許多的版本控制系統(tǒng)一樣周叮,Git也具有在特定事件發(fā)生之前或之后執(zhí)行特定腳本...
    茗涙閱讀 11,409評論 0 7
  • 《祭美》 我討厭一切規(guī)劃好的事物沃缘,那些條條框框,或那般按部就班地實(shí)行则吟,雖是一種規(guī)律,卻也破壞了自然之美锄蹂,會少了些許...
    點(diǎn)點(diǎn)星燈閱讀 497評論 0 1
  • 今天是光譜的黃種子氓仲,簡言之釋放出好的意念。光譜是代表著釋放和放下得糜。黃種子代表你今天種下什么樣的種子敬扛,定下什么...
    瑪雅13月亮歷體驗記閱讀 740評論 0 1