title: “从零到一:我的个人博客自动化部署问题日志” tags: [“建站”, “Hugo”, “GitHub”, “踩坑记录”, “教程”, “问题日志”]
本文是一份详尽的技术问题日志,旨在精准记录我在24小时内,从零基础开始,通过 Hugo 和 GitHub Actions 搭建一个全自动个人博客所遇到的所有障碍、诊断过程及最终解决方案。
初始目标
使用 Hugo 静态网站生成器和 GitHub Pages 服务,构建一个可以通过 git push
自动更新内容的个人博客。
问题日志
阶段一:本地环境搭建
问题 #1:'git' 不是内部或外部命令...
- 触发操作: 在 Windows 11 的 CMD/PowerShell 中首次运行
git init
。 - 诊断: 这是典型的环境变量缺失。系统未安装 Git,或已安装但其可执行文件路径未被添加到系统的 PATH 环境变量中。
- 解决方案:
- 从
git-scm.com
下载并安装 Git for Windows。 - 在安装向导的
Adjusting your PATH environment
步骤,必须选择Git from the command line and also from 3rd-party software
选项,以确保 Git 命令在全局可用。
- 从
问题 #2:fatal: ... Connection was reset
(下载主题时)
- 触发操作: 运行
git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod
。 - 诊断: 这是一个纯粹的网络连接问题。
git
通过 HTTPS 协议克隆仓库的过程中,连接被服务器或中间网络设备重置。多次重试均在下载中途失败。 - 解决方案(绕行):
- 放弃使用
git submodule
命令。 - 直接在浏览器中访问主题的 GitHub 仓库页面。
- 点击
Code
->Download ZIP
,手动下载主题的完整压缩包。 - 解压后,将
hugo-PaperMod-master
文件夹重命名为PaperMod
。 - 将重命名后的
PaperMod
文件夹手动移动到本地项目的themes
目录中。此方法完全绕过了不稳定的命令行网络连接。
- 放弃使用
阶段二:首次推送到 GitHub
问题 #3:Author identity unknown
- 触发操作: 运行
git commit -m "..."
。 - 诊断: Git 要求每一次提交(commit)都必须关联一个作者身份(用户名和邮箱)。本地 Git 配置中缺少此信息。
- 解决方案:
- 执行以下两条命令,配置全局的用户信息。此操作只需在新机器上执行一次。
git config --global user.name "Dandroi" git config --global user.email "you@example.com" # 替换为自己的GitHub邮箱
问题 #4:! [rejected] main -> main (fetch first)
- 触发操作: 运行
git push origin main
。 - 诊断: 远程仓库(GitHub)包含了本地仓库所没有的提交记录。这是因为我为了解决部署问题,直接在 GitHub 网站上编辑了
hugo.yml
文件,导致远程版本领先于本地版本。Git 出于安全考虑,拒绝了可能覆盖远程更改的推送。 - 解决方案:
- 遵循 Git 的提示,执行
git pull origin main
,将远程的更改拉取到本地并与本地修改进行合并。 - 在执行
pull
后,系统自动进入 Vim 编辑器界面,要求输入合并备注。通过输入:wq
并按回车,保存默认备注并退出。 - 完成合并后,再次执行
git push origin main
,推送成功。
- 遵循 Git 的提示,执行
阶段三:自动化部署 (GitHub Actions)
问题 #5:Error: Get Pages site failed... Not Found
- 触发操作: GitHub Actions 首次运行。
- 诊断: 初始的
hugo.yml
工作流配置不正确。它尝试在源码仓库 (my-blog
) 自身上启用和部署 Pages,但我们的计划是将静态文件部署到一个独立的目标仓库 (dandroi.top
)。 - 解决方案:
- 更换
hugo.yml
的内容,使用peaceiris/actions-gh-pages
这个第三方 Action,并明确配置external_repository
参数,指定部署的目标仓库。
- 更换
问题 #6:Error: ... GITHUB_TOKEN does not support to push to an external repository
- 触发操作: 使用了新的
hugo.yml
后,GitHub Actions 再次运行。 - 诊断: 这是一个权限问题。工作流默认使用的
GITHUB_TOKEN
仅有权限操作其所在的仓库 (my-blog
)。它没有权限向另一个外部仓库 (dandroi.top
) 推送内容。 - 解决方案:
- 生成个人访问令牌 (PAT): 在 GitHub
Settings
->Developer settings
->Personal access tokens
中,生成一个具有repo
范围权限的经典个人访问令牌。生成后必须立刻复制并保存该令牌。 - 在源码仓库中添加 Secret: 在
my-blog
仓库的Settings
->Secrets and variables
->Actions
中,创建一个名为ACTIONS_DEPLOY_KEY
的新 Repository secret,其值为上一步生成的 PAT。 - 更新工作流文件: 修改
hugo.yml
,将部署步骤中的github_token: ${{ secrets.GITHUB_TOKEN }}
替换为personal_token: ${{ secrets.ACTIONS_DEPLOY_KEY }}
。
- 生成个人访问令牌 (PAT): 在 GitHub
阶段四:最终的“拦路虎”——本地环境兼容性
问题 #7:git@github.com: Permission denied (publickey)
,伴随 Could not create directory...
- 触发操作: 在本地命令行中,尝试通过
git push
或git pull
与配置了 SSH 协议的远程仓库进行交互。 - 诊断: 这是本次建站过程中最底层、最顽固的问题。其根源在于我的 Windows 用户名包含中文字符(“王玉航”)。
- 我所使用的命令行版 Git for Windows 内置的 SSH 客户端,在处理非 ASCII 字符的用户路径时存在兼容性缺陷。
- 当 SSH 首次连接,需要将服务器指纹写入
C:\Users\王玉航\.ssh\known_hosts
文件时,因无法正确解析中文路径而失败。 - 即使手动创建了
.ssh
文件夹和known_hosts
文件,后续的读写操作依然失败,导致公钥认证无法完成。 - 结论: 这是一个无法在当前命令行环境下轻易解决的底层工具兼容性问题。重命名系统用户文件夹风险极高,不可取。
- 最终解决方案(决定性):
- 彻底放弃在命令行中执行
push
和pull
操作。 - 下载并安装 GitHub Desktop 官方图形化客户端。
- 使用 GitHub Desktop “添加本地仓库”功能,接管我的
my-blog
项目。 - 此后,所有提交和推送操作均通过 GitHub Desktop 的图形界面完成。该软件在后台使用了更健壮的方式处理认证和文件路径,完美绕开了命令行工具的缺陷。
- 彻底放弃在命令行中执行
最终工作流
经过以上所有问题的解决与绕行,我最终确立了稳定、高效的博客发布流程:
- 本地写作: 使用任何文本编辑器创作 Markdown 文章。
- 本地预览 (可选): 运行
hugo server
在本地浏览器中实时查看效果。 - 提交更改: 打开 GitHub Desktop,为本次修改填写备注,点击
Commit to main
。 - 一键发布: 点击 GitHub Desktop 顶部的
Push origin
按钮。
GitHub Actions 会在后台自动完成所有构建和部署工作。几分钟后,更新就会出现在我的线上博客。
总结
这次经历远超“搭建一个博客”本身。它是一次完整的、高强度的工程问题排查实践。我学会了如何阅读和理解错误日志,如何通过隔离变量来诊断问题,以及最重要的——当工具或环境成为障碍时,如何果断地寻找并切换到更合适的解决方案。