## 了解什么是GitHooks
簡單來說就是Git 能在你執行`git push`、`git commit`等命令后的特定時間執行指定的腳本。
例如:使用`git push`向服務器同步本地代碼完畢后,服務端的git就會自動幫我們執行`post-receive`腳本,我們就可以在`post-receive`腳本里面編寫我們的自動部署代碼啦!(這需要一點點shell腳本的編寫知識哦~)。
有兩組這樣的鉤子:分為客戶端的和服務器端的。
## 編寫Hook
首先打開我們原先在服務器上創建的`裸倉庫`,在裸倉庫里面有一個`hooks`文件夾,在里面有很多git給我寫的hook例子,例如筆者的hooks文件夾就有這些hook。
```
├── applypatch-msg.sample
├── commit-msg.sample
├── post-receive # 這個自己寫的,用于自動部署的腳本,會在同步代碼完成時由git來運行它
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-push.sample
├── pre-rebase.sample
└── update.sample
```
想要了解更多hook可以查看[git官方文檔](https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90)
post-receive的具體內容如下
```
# 該環境變量會影響部分git命令的執行
unset GIT_DIR
# 獲取生產環境所有文件的寫權限,防止deploy.sh中更改了權限,導致無法更新情況
chmod u+w -R /www/wwwroot/TBlog
# 忽略文件的權限,否則后面更改deploy.sh的權限,會導致無法git pull,因為版本內容不一致。
git config core.filemode false
echo '開始更新生產環境的代碼...'
cd /www/wwwroot/TBlog
git pull origin master
# 執行部署腳本
if [ -d ]
then
echo '執行項目的部署腳本'
chmod u+x /www/wwwroot/TBlog/deploy.sh # 給予執行權限
/www/wwwroot/TBlog/deploy.sh
fi
echo '生產倉庫更新完畢'
```