hexo 通过自定义git远程仓库实现一键部署到站点
通过在服务器上自建git远程仓库,通过hexo-deployer-git实现自动推送到git仓库,利用仓库更新钩子函数实现站点自动更新。
创建远程仓库
登录阿里云服务器
创建git用户
1
2
3
4
5新建一个专门用于git推送的服务器用户
useradd git
切换到该用户
su - git创建存储目录,并设置权限,否则后续命令执行可能会遇到权限问题
1
2mkdir /data
chown -R git:git /data创建git仓库
1
2
3
4
5
6新建保存git仓库的目录
mkdir /data/git-reps/my-blog.git
cd /data/git-reps/my-blog.git
创建git裸仓库
git init --bare注意:必须使用
--bare参数来创建裸仓库,才能接收代码推送
配置sudo免密
本地文件创建密钥
1 | ssh-keygen -t rsa -C "备注信息" -f ~/.ssh/myblog |
在~/.ssh目录会生成两个文件myblog、myblog.pub
本地配置ssh config
本地存在多个ssh密钥需要管理,在本地新建config文件来管理多个ssh密钥
新建
~/.ssh/config文件配置ssh使用的公钥
其中,
Host可以自定义,HostName为真实的服务器地址信息,可以是IP,也可以是可以正常解析的域名
1 | Host blog.plcent.com |
配置服务器ssh免密
- 获取本地生成的公钥文件
myblog.pub的内容 - 使用
git用户登录服务器(或者使用其他用户登录后切换到git用户) - 复制公钥内容到服务器
~/.ssh/authorized_keys
1 | 确认所在的目录正确 |
你也可以使用
ssh-copy-id类复制命令来执行这个过程
测试ssh
本地目录测试配置是否正确
1 | ssh -T git@blog.plcent.com |
git@blog.plcent.com中,git是服务器新建的用户名, blog.plcent.com是本地~/.ssh/config配置文件中,Host 所写的ssh服务器信息,该信息可以自定义编写。

配置git推送
安装hexo-deployer-git
1 | npm install hexo-deployer-git --save |
编辑 _config.yml
打开
_config.yml配置文件写入下面信息
1
2
3
4
5
6deploy:
type: git
repo: git@blog.plcent.com:/data/git-reps/my-blog.git
branch: master
message:
token:推送当前代码到自定义git仓库
1 | npx hexo deploy |
hexo-deployer-git根据配置文件所配置的远程git仓库信息,在项目根目录下生成.deploy_git目录,并生成站点内容,并强制推送到存储库来工作。 如果不存在.deploy_git,则将git init`初始化存储库。 否则,将使用当前存储库(及其提交历史记录)。
相当于:
1 | git clone git@blog.plcent.com:/data/git-reps/my-blog.git .deploy_git |
你也可以手动执行下面目录,生成仓库目录并保留提交历史。
配置git仓库钩子
进入远程仓库的 hooks 目录
远程仓库(裸仓库)的钩子脚本存放在
hooks目录下,先通过 SSH 登录服务器,进入该目录。1
cd /data/git-reps/my-blog.git/hooks
创建 post-receive 钩子脚本
在
hooks目录下创建post-receive文件(无后缀),并写入执行逻辑:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 远程仓库地址(裸仓库)
REPO_DIR=/data/git-reps/my-blog.git
# 目标部署目录
DEPLOY_DIR=/app/blog
# 日志文件
LOG_FILE=~/.log/git-deploy.log
# 检查并创建日志目录(如果不存在)
LOG_DIR=$(dirname "$LOG_FILE") # 提取目录部分(即 ~/.log)
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR" # -p 确保父目录不存在时也能创建,且不报错
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 日志目录 $LOG_DIR 不存在,已自动创建" >> "$LOG_FILE"
fi
# 执行以下命令,添加例外(当前用户执行即可,无需 root)
git config --global --add safe.directory $REPO_DIR
echo "部署开始于 $(date)" >> $LOG_FILE
# 如果不存在git仓库目录,克隆git仓库
if [ ! -d $DEPLOY_DIR ]; then
mkdir -R $DEPLOY_DIR
git clone $REPO_DIR $DEPLOY_DIR
echo "$DEPLOY_DIR 不存在,重新拉取仓库" >> $LOG_FILE
fi
git checkout master
# 拉取最新代码
# 注意此处,指定路径
git --work-tree=$GIT_DIR --git-dir=$GIT_DIR/.git pull >> $LOG_FILE
if [ $? eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 拉取最新代码 success" >> $LOG_FILE
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 拉取最新代码 fail $?" >> $LOG_FILE
fi
echo "部署完成 $(date)" >> $LOG_FILE为脚本增加运行权限
1
chmod +x post-receive
测试
在服务器手动执行该脚本测试是否正常运行
1
2cd /data/git-reps/my-blog.git
./post-receive
推送站点部署更新
在本地执行推送hexo部署命令,即可将代码推送到服务器的git仓库,推送时即会触发钩子响应执行部署脚本。
1 | hexo clean && hexo generate && hexo deploy |
.deploy_git目录部署推送的内容来自与public目录
hexo 通过自定义git远程仓库实现一键部署到站点

