git掛鉤簡介
- git hooks是一些自定義的腳本,用於控制git工做的流程,分爲客戶端鉤子和服務端鉤子。
- 客戶端鉤子包括:
pre-commit
、prepare-commit-msg
、commit-msg
、post-commit
等,主要用於控制客戶端git的提交工做流。服務端鉤子:pre-receive
、post-receive
、update
,主要在服務端接收提交對象時、推送到服務器以前調用。
- git hooks位置位於每一個git項目下的隱藏文件夾.git中的hooks文件夾裏,進去後會看到一些hooks的官方示例,他們都是以.sample結尾的文件名。注意這些以.sample結尾的示例腳本是不會執行的,只有重命名後纔會生效
- 具體內容能夠參考git的文檔
pre-commit
pre-commit
是客戶端hooks之一,也是接下來要介紹的鉤子。pre-commit
在git add
提交以後,而後執行git commit
時執行,腳本執行沒報錯就繼續提交,反之就駁回提交的操做。
- 這個鉤子中能夠實現:對將要提交的代碼進行檢查、優化代碼格式、或者對提交的圖片進行壓縮等等任務。下面是用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
獲取到提交到暫存區的文件,我這裏添加了過濾即只獲取.vue和.js文件。
- 而後判斷eslint是否已安裝,接着再對獲取到的文件依次檢查,當某個文件檢查不經過時不會中斷進程,會繼續遍歷全部文件,這樣最後在控制檯能夠顯示出全部檢查不經過的文件信息
- exit即表示退出當前腳本進程、後面接上狀態碼,0表示正常,會繼續執行
git commit
的操做,其餘狀況表示出錯,不會繼續commit。
- 將上面的代碼保存爲
pre-commit
,而後存放在.git/hooks中,而後每次執行git commit
時就會使用eslint進行代碼檢查了。
注意事項
eslint
最好全局安裝,必需要保證執行hooks的git目錄下可以直接執行。
.git
裏面的文件,沒法提交到git項目上去,因此最好在git目錄最外層新建一個同名的hooks
文件夾,把寫好的腳步放裏面。新clone該項目時,在根目錄執行一下cp hooks/* .git/hooks/
把腳本文件複製到.git裏去。
- 有時候也會遇到腳本文件沒有執行權限的狀況,這時hooks就沒法生效,須要用到
chomd
指令給腳本文件加上執行權限。