Git Hook

git hook 通過在代碼commit和push之前執(zhí)行一個(gè)腳本,來實(shí)現(xiàn)一些檢查性工作??。

在.git/hooks目錄下的腳本文件,默認(rèn)情況下該目錄下有以下文件

applypatch-msg.sample

commit-msg:sample

pre-applypatch.sample

pre-commit.sample

pre-push.sample

pre-rebase.sample

prepare-commit-msg.sample


update.sample

pre-receive.sample

post-update:sample

分割線前面幾種是客戶端鉤子,后面幾種是服務(wù)端鉤子

pre-receive可以用來在服務(wù)端設(shè)置一些代碼檢查的功能,通過它可以拒絕一些不滿足條件的push,無情的推行代

碼檢查。

post-receive它發(fā)生在push代碼之后,可以通過CI來觸發(fā)一些測試代碼。

若要相應(yīng)的鉤子生效,編輯腳本文件的內(nèi)容,去掉.sample后綴即可。腳本若返回非0值,則相應(yīng)的git操作不再

往后執(zhí)行。

通過pre-push來舉個(gè)??

現(xiàn)在我想在每次push文件之時(shí),檢查項(xiàng)目中有沒有重復(fù)圖片,來減少不必要的包體積。假設(shè)檢查重復(fù)圖片的

腳本叫做duplicate_image_detector.py

現(xiàn)在通過客戶端鉤子來實(shí)現(xiàn),因?yàn)?/.git/hooks下的文件是無法通過git來進(jìn)行管理,所以只能在客戶端自己將

hook腳本拷貝在./.git/hoos目錄下了,hook腳本本身可以通過git來管理。

hook腳本如下:

#!/bin/bash
# 圖片檢測
if [ ! -f "./Checkers/duplicate_image_detector.py" ]; then
  echo "未集成圖片檢測腳本"
  exit 1
fi

如果有多個(gè)任務(wù)需要處理,下一個(gè)任務(wù)需要在上一個(gè)任務(wù)成功之后再執(zhí)行,則需要通過:

$? -eq 0

條件來判斷上個(gè)任務(wù)是否以0結(jié)束,以0結(jié)束表示執(zhí)行成功,反之返回非0就代表任務(wù)結(jié)束,不再繼續(xù)執(zhí)行了,整

體類似:

#前置任務(wù)
#./abc/xyz/xx.rb

if [ $? -eq 0 ]; then
    echo "***********xx.rb檢測腳本通過****************"
else
    echo "***********xx.rb檢測腳本未通過****************"
    exit 1
fi

# 圖片檢測
if [ ! -f "./Checkers/duplicate_image_detector.py" ]; then
  echo "未集成圖片檢測腳本"
  exit 1
fi

如果為了進(jìn)一步方便,再寫一個(gè)腳本來檢查當(dāng)前環(huán)境是否準(zhǔn)備好了hook腳本,并進(jìn)行本地部署:

#!/bin/bash

if ![-f ./shell/pre-push]; then
    echo "沒有找到hook的腳本文件"
    exit(1)
fi

if [-f ./.git/hooks/pre-push.sample]; then
    rm ./.git/hooks/pre-push.sample
fi

cp  ./shell/pre-push ./.git/hooks/pre-push

echo "hook設(shè)置成功"

每次有新人就讓他手動(dòng)調(diào)用一下這個(gè)腳本,最好的方式是希望能夠?qū)?git/hooks/下的腳本納入git管理。暫時(shí)沒有找到解決方案??,或者部署在服務(wù)端,但是需要管理員權(quán)限。

針對于上述問題,最后在同事提示下找到一個(gè)替換的方案。在Xcode的Build Phases中添加一個(gè)"Run Script"功能,在Xcode每次編譯的時(shí)候都會執(zhí)行這個(gè)腳本。

首先setupHook.sh需要修改一下:

#!/bin/bash

if [ -f ./shell/pre-push ]; then
    echo "hook文件存在"
else
    echo "hook文件不存在"
    exit 1
fi

if [ -f ./.git/hooks/pre-push.sample ]; then
    rm ./.git/hooks/pre-push.sample
fi

if [ -f ./.git/hooks/pre-push ]; then
    echo "hook已經(jīng)設(shè)置過"
else
    echo "hook未設(shè)置,開始設(shè)置"
    cp  ./shell/pre-push ./.git/hooks/pre-push
    echo "hook設(shè)置成功"
fi

然后再將setupHook.sh腳本添加進(jìn)去如下所示:

Run Script

還需要修改一下腳本執(zhí)行權(quán)限,在cmd中執(zhí)行:

chmod u+x setupHook.sh

再Build一下,最后會看到如下輸出:

log

就說明設(shè)置生效了。

這樣一來,就不用太擔(dān)心某個(gè)同學(xué)因?yàn)橥浽O(shè)置hook腳本而提交代碼沒有觸發(fā)腳本的問題了,因?yàn)樘峤淮a之前不太可能不會Build代碼,但是還是需要在README中顯示的提醒一下,最后一步只是以防萬一。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容