## 了解什么是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 '生产仓库更新完毕'
```