hexo 通过自定义git远程仓库实现一键部署到站点

通过在服务器上自建git远程仓库,通过hexo-deployer-git实现自动推送到git仓库,利用仓库更新钩子函数实现站点自动更新。

创建远程仓库

  1. 登录阿里云服务器

  2. 创建git用户

    1
    2
    3
    4
    5
    # 新建一个专门用于git推送的服务器用户
    $ useradd git

    # 切换到该用户
    $ su - git
  3. 创建存储目录,并设置权限,否则后续命令执行可能会遇到权限问题

    1
    2
    mkdir /data
    chown -R git:git /data
  4. 创建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目录会生成两个文件myblogmyblog.pub

本地配置ssh config

本地存在多个ssh密钥需要管理,在本地新建config文件来管理多个ssh密钥

  1. 新建~/.ssh/config文件

  2. 配置ssh使用的公钥

    其中,Host可以自定义,HostName为真实的服务器地址信息,可以是IP,也可以是可以正常解析的域名

1
2
3
4
Host blog.plcent.com
HostName blog.plcent.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/myblog

配置服务器ssh免密

  1. 获取本地生成的公钥文件myblog.pub的内容
  2. 使用git用户登录服务器(或者使用其他用户登录后切换到git用户)
  3. 复制公钥内容到服务器~/.ssh/authorized_keys
1
2
3
4
5
6
7
8
9
10
# 确认所在的目录正确
$ pwd
/home/git

# 创建.ssh目录
$ mkdir .ssh

# 写入myblog.pub公钥文件内容
$ vi authorized_keys

你也可以使用ssh-copy-id类复制命令来执行这个过程

测试ssh

本地目录测试配置是否正确

1
$ ssh -T git@blog.plcent.com

git@blog.plcent.com中,git是服务器新建的用户名, blog.plcent.com是本地~/.ssh/config配置文件中,Host 所写的ssh服务器信息,该信息可以自定义编写。

1761028448460

配置git推送

安装hexo-deployer-git

1
npm install hexo-deployer-git --save

编辑 _config.yml

  1. 打开_config.yml配置文件

  2. 写入下面信息

    1
    2
    3
    4
    5
    6
    deploy:
    type: git
    repo: git@blog.plcent.com:/data/git-reps/my-blog.git
    branch: master
    message:
    token:
  3. 推送当前代码到自定义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仓库钩子

  1. 进入远程仓库的 hooks 目录

    远程仓库(裸仓库)的钩子脚本存放在 hooks 目录下,先通过 SSH 登录服务器,进入该目录。

    1
    $ cd /data/git-reps/my-blog.git/hooks
  2. 创建 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
    #!/bin/bash

    # 远程仓库地址(裸仓库)
    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
  3. 为脚本增加运行权限

    1
    $ chmod +x post-receive
  4. 测试

    在服务器手动执行该脚本测试是否正常运行

    1
    2
    $ cd /data/git-reps/my-blog.git
    $ ./post-receive

推送站点部署更新

在本地执行推送hexo部署命令,即可将代码推送到服务器的git仓库,推送时即会触发钩子响应执行部署脚本。

1
$ hexo clean && hexo generate && hexo deploy

.deploy_git目录部署推送的内容来自与public目录

hexo 通过自定义git远程仓库实现一键部署到站点

https://blog.plcent.com/hexo-deployer-git/

作者

Nolly

发布于

2025-10-21

更新于

2025-10-21

许可协议

评论