Hexo 如何实现源码私有、页面公开部署
使用 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 源码,那么迁移到私有仓库后,需要清理公开仓库的源码分支。
步骤是:
- 确认源码已经完整推送到私有仓库。
- 确认公开仓库的 GitHub Pages 使用的是部署分支,例如
master。 - 删除公开仓库中的源码分支,例如
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 原文、配置文件和主题源码继续暴露在公开仓库中。
