使用git鉤子對提交代碼進行檢查(pre-commit)

git掛鉤簡介

  • git hooks是一些自定義的腳本,用于控制git工作的流程,分為客戶端鉤子和服務端鉤子。
  • 客戶端鉤子包括:pre-commit、prepare-commit-msgcommit-msg、post-commit等,主要用于控制客戶端git的提交工作流。服務端鉤子:pre-receive、post-receive、update,主要在服務端接收提交對象時、推送到服務器之前調(diào)用。
  • git hooks位置位于每個git項目下的隱藏文件夾.git中的hooks文件夾里,進去后會看到一些hooks的官方示例,他們都是以.sample結(jié)尾的文件名。注意這些以.sample結(jié)尾的示例腳本是不會執(zhí)行的,只有重命名后才會生效
    樣本hooks
  • 具體內(nèi)容可以參考git的文檔

pre-commit

  • pre-commit是客戶端hooks之一,也是接下來要介紹的鉤子。pre-commitgit add提交之后,然后執(zhí)行git commit時執(zhí)行,腳本執(zhí)行沒報錯就繼續(xù)提交,反之就駁回提交的操作。
  • 這個鉤子中可以實現(xiàn):對將要提交的代碼進行檢查、優(yōu)化代碼格式、或者對提交的圖片進行壓縮等等任務。下面是用shell編寫的具體代碼:
STAGE_FILES=$(git diff --cached --name-only --diff-filter=ACM -- '*.vue' '*.js')
if test ${#STAGE_FILES} -gt 0
then
    echo '開始eslint檢查'

    which eslint &> /dev/null
    if [[ "$?" == 1 ]]; then
        echo '沒安裝eslint'
        exit 1
    fi

    PASS=true

    for FILE in $STAGE_FILES
    do
        eslint $FILE
        if [[ "$?" == 1 ]]; then
      PASS=false
    fi
  done

  if ! $PASS; then
      echo "eslint檢查沒通過!"
      exit 1
  else
      echo "eslint檢查完畢"
  fi

else
    echo '沒有js文件需要檢查'
fi

exit 0
  • 稍微解釋下:首先用git diff獲取到提交到暫存區(qū)的文件,我這里添加了過濾即只獲取.vue和.js文件。
  • 然后判斷eslint是否已安裝,接著再對獲取到的文件依次檢查,當某個文件檢查不通過時不會中斷進程,會繼續(xù)遍歷所有文件,這樣最后在控制臺可以顯示出所有檢查不通過的文件信息
  • exit即表示退出當前腳本進程、后面接上狀態(tài)碼,0表示正常,會繼續(xù)執(zhí)行git commit的操作,其他情況表示出錯,不會繼續(xù)commit。
  • 將上面的代碼保存為pre-commit,然后存放在.git/hooks中,然后每次執(zhí)行git commit時就會使用eslint進行代碼檢查了。
    image

注意事項

  • 另外除了eslint,還可以使用其他更多的工具來檢查代碼,比如prettier來格式化代碼,一些類名檢查器來檢查css代碼等等,上述這些都可以寫在pre-commit鉤子里面。
  • eslint最好全局安裝,必須要保證執(zhí)行hooks的git目錄下能夠直接執(zhí)行。
  • .git里面的文件,無法提交到git項目上去,所以最好在git目錄最外層新建一個同名的hooks文件夾,把寫好的腳步放里面。新clone該項目時,在根目錄執(zhí)行一下cp hooks/* .git/hooks/把腳本文件復制到.git里去。
  • 有時候也會遇到腳本文件沒有執(zhí)行權(quán)限的情況,這時hooks就無法生效,需要用到chomd指令給腳本文件加上執(zhí)行權(quán)限。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 那天和室友在她同事在吃飯,突然聊到墨爾本陰雨天曬衣難的問題。 同事問:“你們沒有買烘干機嗎?” 我回:“我們剛從昆...
    科學摸魚閱讀 291評論 0 5
  • 引用類型的值(對象)是引用類型的一個實例。在ECMAScript中,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在...
    AlexTamir閱讀 564評論 0 0

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