使用 Hexo 搭建博客时,我们通常会接触到两类文件:

  • Hexo 源代码:Markdown 文章、主题配置、站点配置、脚手架、依赖文件等。
  • 静态网页文件:Hexo 生成后的 HTML、CSS、JS、图片等,也就是访问者真正看到的网页。

如果把这两类文件都放在同一个公开仓库里,别人不仅能看到博客页面,也能看到你的 Markdown 原文、草稿结构、主题配置和提交历史。为了更好地管理博客,可以采用一种更清晰的方案:源码放私有仓库,网页放公开仓库

1. 为什么要分开部署

Hexo 的工作流程可以理解为:

Hexo 源代码
    |
    | npx hexo generate
    v
静态网页文件
    |
    | npx hexo deploy
    v
GitHub Pages 公开访问

访问者真正需要的是生成后的静态网页,并不需要看到你的 Hexo 源代码。

因此,更合理的结构是:

私有仓库:保存 Hexo 源代码
公开仓库:保存 hexo deploy 生成的网页文件

这样既能正常公开博客,又能避免源码仓库暴露。

2. public 和 privacy 分别放什么

这里的命名可以按自己的习惯理解:

  • privacy:表示私有源码仓库,保存 Hexo 项目本身。
  • public:表示公开页面仓库,保存部署后的静态网页。

以我的博客为例:

privacy / 私有源码仓库:
https://github.com/lsWorl/MyBlog

public / 公开页面仓库:
https://github.com/lsWorl/lsWorl.github.io

私有仓库中保存的是:

source/
themes/
scaffolds/
_config.yml
_config.butterfly.yml
package.json
package-lock.json

公开仓库中保存的是:

index.html
archives/
categories/
tags/
css/
js/
img/
sitemap.xml
atom.xml

也就是说,公开仓库只需要放 Hexo 生成后的页面,不需要放 Markdown 源文。

3. 整体仓库结构

推荐结构如下:

D:\MyBlog
├── source                  # 文章源码
├── themes                  # 主题
├── scaffolds               # 文章模板
├── _config.yml             # Hexo 主配置
├── _config.butterfly.yml   # Butterfly 主题配置
├── package.json
└── package-lock.json

这个目录本身连接到私有仓库:

git remote add origin https://github.com/lsWorl/MyBlog.git

同时,Hexo 的部署目标指向公开仓库:

deploy:
  type: 'git'
  repo: 'https://github.com/lsWorl/lsWorl.github.io.git'
  branch: master

这样,源码和页面就分开了:

git push origin main

负责把源码推到私有仓库。

hexo deploy

负责把生成后的网页推到公开仓库。

4. 第一步:创建私有源码仓库

先在 GitHub 上创建一个私有仓库,例如:

lsWorl/MyBlog

创建时选择 Private

这个仓库用于保存 Hexo 源码,因此不要把它设置为 GitHub Pages 的发布仓库。

如果本地已有 Hexo 项目,可以在项目目录中执行:

git remote rename origin public
git remote add origin https://github.com/lsWorl/MyBlog.git
git push -u origin main

这里的含义是:

  • 把原来的公开仓库远程名改成 public,表示它只负责公开页面。
  • 新增私有仓库作为 origin,表示它负责保存源码。

查看远程仓库:

git remote -v

理想结果类似:

origin  https://github.com/lsWorl/MyBlog.git
public  https://github.com/lsWorl/lsWorl.github.io.git

5. 第二步:配置 Hexo deploy

在 Hexo 项目的 _config.yml 中配置:

deploy:
  type: 'git'
  repo: 'https://github.com/lsWorl/lsWorl.github.io.git'
  branch: master

这段配置的意思是:

  • type: git:使用 Git 方式部署。
  • repo:部署到公开页面仓库。
  • branch: master:把生成后的网页推送到公开仓库的 master 分支。

注意:这里配置的是公开页面仓库,而不是私有源码仓库。

6. 第三步:忽略生成物

私有源码仓库不应该提交 public/.deploy_git/

可以在 .gitignore 中保留:

node_modules/
public/
.deploy*/
db.json
*.log

原因是:

  • node_modules/ 可以通过 npm install 重新安装。
  • public/ 是 Hexo 生成物,可以重新生成。
  • .deploy_git/ 是 Hexo deploy 的临时部署仓库。
  • db.json 是 Hexo 缓存文件。

源码仓库只需要保存能复现博客的源文件。

7. 日常写作流程

以后写博客时,可以按下面的流程来。

新建文章:

hexo new post "文章标题"

本地预览:

hexo clean
hexo g
hexo s

确认没问题后,先保存源码:

git add .
git commit -m "add new blog post"
git push origin main

然后发布网页:

npx hexo d

这两步分别对应:

源码保存到 privacy
网页发布到 public

8. 如果公开仓库原来有源码怎么办

如果以前公开仓库中有 main 分支保存 Hexo 源码,那么迁移到私有仓库后,需要清理公开仓库的源码分支。

步骤是:

  1. 确认源码已经完整推送到私有仓库。
  2. 确认公开仓库的 GitHub Pages 使用的是部署分支,例如 master
  3. 删除公开仓库中的源码分支,例如 main

可以使用命令:

git push public --delete main

如果 GitHub 提示认证失败,需要先配置 GitHub 登录,或者使用 Personal Access Token。

删除公开源码分支后,公开仓库中只保留部署产物,别人就不能直接从公开仓库看到 Hexo 源代码。

需要注意的是:如果源码曾经公开过,不能保证历史上完全没人 clone 或缓存过。这个方案主要是从迁移之后开始,让源码不再继续公开。

9. 常见问题

9.1 hexo deploy 报 Spawn failed

hexo deploy 最后会调用 Git 命令提交并推送生成后的静态网页。如果出现:

Error: Spawn failed

常见原因有:

  • GitHub 认证失败。
  • .deploy_git 缓存目录异常。
  • 远程分支已有历史,本地部署分支无法 fast-forward。
  • deploy 配置的仓库地址不正确。

可以先检查:

git remote -v

再检查 _config.yml 中的 deploy 配置。

如果 .deploy_git 出现异常,可以删除它后重新部署:

rm -rf .deploy_git
npx hexo clean
npx hexo g
npx hexo d

Windows PowerShell 可以使用:

Remove-Item .deploy_git -Recurse -Force

9.2 为什么不能只把同一个仓库改成私有

如果使用的是免费 GitHub 账号,GitHub Pages 通常需要公开仓库才能公开访问。更通用的做法是:

私有仓库保存源码
公开仓库保存网页

这样既不影响博客访问,也能保护源码。

9.3 public 分支和 public 文件夹是不是一回事

不是。

Hexo 中常见的 public/ 是本地生成目录:

D:\MyBlog\public

而本文说的 public 更多是一个概念,指公开的页面仓库:

lsWorl/lsWorl.github.io

为了避免混淆,也可以把远程仓库命名为:

git remote rename public pages

核心思想不变:源码私有,页面公开。

10. 总结

Hexo 博客分开部署的关键是:

Hexo 源代码 -> 私有仓库
hexo deploy 生成的静态网页 -> 公开仓库

日常使用时只需要记住两条命令分别负责两件事:

git push origin main

保存源码。

npx hexo d

发布网页。

这样既保留了 GitHub Pages 的公开访问能力,又避免把 Markdown 原文、配置文件和主题源码继续暴露在公开仓库中。