git hooks之——pre-commit

wuliToken發表於2018-04-23

git掛鉤簡介

  • git hooks是一些自定義的指令碼,用於控制git工作的流程,分為客戶端鉤子和服務端鉤子。
  • 客戶端鉤子包括:pre-commitprepare-commit-msgcommit-msgpost-commit等,主要用於控制客戶端git的提交工作流。服務端鉤子:pre-receivepost-receiveupdate,主要在服務端接收提交物件時、推送到伺服器之前呼叫。
  • git hooks位置位於每個git專案下的隱藏資料夾.git中的hooks資料夾裡,進去後會看到一些hooks的官方示例,他們都是以.sample結尾的檔名。注意這些以.sample結尾的示例指令碼是不會執行的,只有重新命名後才會生效
    樣本hooks
  • 具體內容可以參考git的文件

pre-commit

  • pre-commit是客戶端hooks之一,也是接下來要介紹的鉤子。pre-commitgit 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進行程式碼檢查了。
    image

注意事項

  • eslint最好全域性安裝,必須要保證執行hooks的git目錄下能夠直接執行。
  • .git裡面的檔案,無法提交到git專案上去,所以最好在git目錄最外層新建一個同名的hooks資料夾,把寫好的腳步放裡面。新clone該專案時,在根目錄執行一下cp hooks/* .git/hooks/把指令碼檔案複製到.git裡去。
  • 有時候也會遇到指令碼檔案沒有執行許可權的情況,這時hooks就無法生效,需要用到chomd指令給指令碼檔案加上執行許可權。

相關文章