<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GitHub | ForeverYang's 博客</title><link>https://blog.foreveryang.top/blog/github/</link><description>ForeverYang's 博客 中「GitHub」的最新内容</description><generator>Hugo</generator><language>zh-cn</language><managingEditor>mythstraw@msn.com (ForeverYang)</managingEditor><webMaster>mythstraw@msn.com (ForeverYang)</webMaster><copyright>Copyright © 2026, ForeverYang</copyright><lastBuildDate>Sun, 27 Sep 2026 17:50:00 +0800</lastBuildDate><atom:link href="https://blog.foreveryang.top/blog/github/index.xml" rel="self" type="application/rss+xml"/><item><title>GitHub 部署自己的个人博客网站</title><link>https://blog.foreveryang.top/p/github-deploy-personal-blog/</link><pubDate>Sun, 27 Sep 2026 17:50:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/p/github-deploy-personal-blog/</guid><description>&lt;p&gt;&lt;em&gt;在这个 AI 时代，知识库成了最火的项目。AI 需要知识库来提升专业度，人类需要知识库辅助学习和记忆。但有一个问题是：互联网上有什么是可以永久留存的呢？所有的服务都会随着运营商的倒闭而面临关闭，你用来保存知识库的载体也会随着消失。而目前来看，唯一能够长久存在可能也就只有这个全球最大的仓库 GitHub 了，所以把知识放在 GitHub 上成了很多人的首选方案。&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;想要了解整个详细流程，可以查看 &lt;a href="https://blog.foreveryang.top/p/hugo-github-deploy/"&gt;使用 Hugo + GitHub 部署博客&lt;/a&gt;
 这个详细的文档。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="使用的技术"&gt;使用的技术&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hugo&lt;/strong&gt;：静态 blog 网站工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt; 工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt; 仓库&lt;/li&gt;
&lt;li&gt;AI 工具：&lt;strong&gt;nanobot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; 部署&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub 自定义域名&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="简化的流程说明ai-自动操作"&gt;简化的流程说明（AI 自动操作）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地环境搭建&lt;/strong&gt;：安装 Hugo 和 Git。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建与配置站点&lt;/strong&gt;：初始化 Hugo 站点，选择并配置主题样式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编写与预览内容&lt;/strong&gt;：用 Markdown 写文章，本地启动服务预览。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接 GitHub 并自动化部署&lt;/strong&gt;：将代码推送到 GitHub，配置 Actions 自动构建和发布。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="修改美化-hugo-blog"&gt;修改美化 Hugo Blog&lt;/h2&gt;
&lt;p&gt;先了解一下 Hugo 的整体框架，了解了框架才能知道 AI 改了哪些东西。使用不同的主题，架构可能有一些不同，我们只要了解基础架构，细节就交给 AI 自己去学习。&lt;/p&gt;
&lt;p&gt;&lt;figure
 class="image-caption image-zoom-container"
&gt;
 
 &lt;input
 type="checkbox"
 id="img-8cf948ce"
 class="image-zoom-toggle"
 aria-label="放大图片：Hugo 站点的目录结构"
 /&gt;
 &lt;label
 for="img-8cf948ce"
 class="image-zoom-label"
 &gt;
 &lt;img
 src="https://blog.foreveryang.top/img/blog-github-deploy/hugo-structure.png"
 alt="Hugo 站点的目录结构"
 loading="lazy"
 class="zoomable-image"
 /&gt;
 &lt;/label&gt;
 
 &lt;label
 for="img-8cf948ce"
 class="image-zoom-overlay"
 &gt;
 &lt;img
 src="https://blog.foreveryang.top/img/blog-github-deploy/hugo-structure.png"
 alt="Hugo 站点的目录结构"
 class="zoomable-image"
 /&gt;
 &lt;/label&gt;
 
 &lt;figcaption&gt;Hugo 站点的目录结构&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="-核心内容与模板你需要经常编辑的"&gt;📁 核心内容与模板（你需要经常编辑的）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;content/&lt;/code&gt;&lt;/strong&gt;：存放你的博客文章。所有的 Markdown 文件（如 &lt;code&gt;posts/my-first-post.md&lt;/code&gt;）都在这里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;layouts/&lt;/code&gt;&lt;/strong&gt;：存放自定义的 HTML 模板。当你需要覆盖主题的页面结构（如修改页脚、首页样式）时，把主题里的文件复制到这里修改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;static/&lt;/code&gt;&lt;/strong&gt;：存放不需要 Hugo 处理的静态文件。比如自定义的 CSS、JS、图片、favicon 等，Hugo 会原样复制到最终的 &lt;code&gt;public/&lt;/code&gt; 目录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;assets/&lt;/code&gt;&lt;/strong&gt;：存放需要 Hugo 处理（如压缩、编译 SCSS）的文件。通常由主题使用，你也可以在这里放需要打包的 CSS/JS。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;archetypes/&lt;/code&gt;&lt;/strong&gt;：存放内容模板（原型）。当你执行 &lt;code&gt;hugo new posts/xxx.md&lt;/code&gt; 时，Hugo 会以此处的模板生成文章的初始 Front Matter。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;data/&lt;/code&gt;&lt;/strong&gt;：存放数据文件（JSON/YAML/TOML），供模板调用，常用于生成列表或配置信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;i18n/&lt;/code&gt;&lt;/strong&gt;：存放多语言翻译文件。如果你的博客是中文，这里可能主要用于覆盖主题的默认语言字符串。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-hugo-配置与构建自动生成或较少改动"&gt;⚙️ Hugo 配置与构建（自动生成或较少改动）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;themes/&lt;/code&gt;&lt;/strong&gt;：存放你安装的 Hugo 主题（如 PaperMod 或 BearNeo）。&lt;strong&gt;建议永远不要直接修改这个文件夹内的文件&lt;/strong&gt;，以免更新主题时被覆盖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;hugo.yaml&lt;/code&gt;&lt;/strong&gt;：Hugo 站点的&lt;strong&gt;主配置文件&lt;/strong&gt;。你的站点标题、baseURL、菜单、主题参数都在这里设置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;public/&lt;/code&gt;&lt;/strong&gt;：Hugo 构建后生成的&lt;strong&gt;静态网站最终输出目录&lt;/strong&gt;。部署时，GitHub Actions 或 Cloudflare 实际上就是把这里的文件发布出去。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;resources/&lt;/code&gt;&lt;/strong&gt;：Hugo 的缓存目录。存放图片处理、SCSS 编译等生成的中间文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.hugo_build.lock&lt;/code&gt;&lt;/strong&gt;：Hugo 构建时的锁文件，防止多个构建任务同时修改文件。通常不需要管它，会自动生成。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-版本控制与自动化git-相关"&gt;🔀 版本控制与自动化（Git 相关）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.git/&lt;/code&gt;&lt;/strong&gt;：Git 的本地仓库数据。不要手动修改里面的文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.github/&lt;/code&gt;&lt;/strong&gt;：存放 GitHub Actions 工作流。里面有 &lt;code&gt;workflows/hugo.yaml&lt;/code&gt;，是你推送到 GitHub 后自动部署到 GitHub Pages 的配置文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/strong&gt;：告诉 Git 哪些文件和文件夹不需要上传（例如 &lt;code&gt;public/&lt;/code&gt;、&lt;code&gt;resources/&lt;/code&gt;、&lt;code&gt;.hugo_build.lock&lt;/code&gt; 通常会被忽略）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.gitmodules&lt;/code&gt;&lt;/strong&gt;：如果你用 &lt;code&gt;git submodule&lt;/code&gt; 安装了主题，这个文件记录了主题的仓库地址。由于你用了主题，这个文件很重要，需要在部署时用 &lt;code&gt;submodules: recursive&lt;/code&gt; 拉取。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-部署与托管cloudflare-与-github-pages"&gt;☁️ 部署与托管（Cloudflare 与 GitHub Pages）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.wrangler/&lt;/code&gt;&lt;/strong&gt;：Cloudflare Wrangler CLI 的本地缓存目录。通常不需要手动修改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;wrangler.jsonc&lt;/code&gt;&lt;/strong&gt;：Cloudflare Workers 的配置文件。告诉 Cloudflare 项目名称、构建命令（&lt;code&gt;hugo build --gc --minify&lt;/code&gt;）以及静态资源目录（&lt;code&gt;./public&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CNAME&lt;/code&gt;&lt;/strong&gt;：用于 GitHub Pages 绑定自定义域名的文件（通常包含你的域名）。如果你同时部署到了 Cloudflare 和 GitHub，这个文件会指定 GitHub Pages 的访问域名。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;你只要知道这些文件是干什么的、修改的东西要到哪里去查看就可以了，至于操作的事情交给 AI。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure
 class="image-caption image-zoom-container"
&gt;
 
 &lt;input
 type="checkbox"
 id="img-bcd3441e"
 class="image-zoom-toggle"
 aria-label="放大图片：BearNeo 主题里，每一个导航就是一个 Markdown 文档"
 /&gt;
 &lt;label
 for="img-bcd3441e"
 class="image-zoom-label"
 &gt;
 &lt;img
 src="https://blog.foreveryang.top/img/blog-github-deploy/bearneo-nav.png"
 alt="BearNeo 主题里，每一个导航就是一个 Markdown 文档"
 loading="lazy"
 class="zoomable-image"
 /&gt;
 &lt;/label&gt;
 
 &lt;label
 for="img-bcd3441e"
 class="image-zoom-overlay"
 &gt;
 &lt;img
 src="https://blog.foreveryang.top/img/blog-github-deploy/bearneo-nav.png"
 alt="BearNeo 主题里，每一个导航就是一个 Markdown 文档"
 class="zoomable-image"
 /&gt;
 &lt;/label&gt;
 
 &lt;figcaption&gt;BearNeo 主题里，每一个导航就是一个 Markdown 文档&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;我使用的主题是 BearNeo，它是一个极简的主题，每一个导航其实就是一个 MD 文档，你也可以自己去打开文档去编辑内容。&lt;/p&gt;
&lt;p&gt;&lt;figure
 class="image-caption image-zoom-container"
&gt;
 
 &lt;input
 type="checkbox"
 id="img-d2370f3c"
 class="image-zoom-toggle"
 aria-label="放大图片：Hugo 的 HTML 模板文件"
 /&gt;
 &lt;label
 for="img-d2370f3c"
 class="image-zoom-label"
 &gt;
 &lt;img
 src="https://blog.foreveryang.top/img/blog-github-deploy/html-template.png"
 alt="Hugo 的 HTML 模板文件"
 loading="lazy"
 class="zoomable-image"
 /&gt;
 &lt;/label&gt;
 
 &lt;label
 for="img-d2370f3c"
 class="image-zoom-overlay"
 &gt;
 &lt;img
 src="https://blog.foreveryang.top/img/blog-github-deploy/html-template.png"
 alt="Hugo 的 HTML 模板文件"
 class="zoomable-image"
 /&gt;
 &lt;/label&gt;
 
 &lt;figcaption&gt;Hugo 的 HTML 模板文件&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果想要做很大的样式上的修改，那就需要去改 HTML 模板了，当然你也可以让 AI 去修改。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="cloudflare-部署了解一下国内访问有限制"&gt;Cloudflare 部署（了解一下，国内访问有限制）&lt;/h2&gt;
&lt;p&gt;Cloudflare 有两种部署方式 pages 和 workers，现在 Cloudflare 开始转向 workers，pages 现在是停止维护但是仍然可以使用的状态。&lt;/p&gt;
&lt;p&gt;这里主要说明 workers 的部署过程。&lt;/p&gt;
&lt;h3 id="选-workers具体设置"&gt;选 Workers：具体设置&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;① 仓库里新增 &lt;code&gt;wrangler.jsonc&lt;/code&gt;&lt;/strong&gt;（这是唯一的仓库改动，AI 会帮你自动完成）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;$schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./node_modules/wrangler/config-schema.json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;foreveryang-blog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;compatibility_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2026-09-27&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;assets&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;directory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./public&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;not_found_handling&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;404-page&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; 必须和控制台里的 Worker 名&lt;strong&gt;完全一致&lt;/strong&gt;，否则构建直接失败（官方明确警告）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compatibility_date&lt;/code&gt; 填你创建那天的日期。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;not_found_handling&lt;/code&gt; 默认是 &lt;code&gt;&amp;quot;none&amp;quot;&lt;/code&gt;（不存在路径只给一句 404）→ 必须写成 &lt;code&gt;&amp;quot;404-page&amp;quot;&lt;/code&gt;，才会用你 &lt;code&gt;404.html&lt;/code&gt; 生成的那个自定义 404 页。&lt;strong&gt;Pages 会自动探测 &lt;code&gt;404.html&lt;/code&gt;，Workers 不会&lt;/strong&gt;，这是从 Pages 思路切过来最容易漏的一项。&lt;/li&gt;
&lt;li&gt;不用写 &lt;code&gt;html_handling&lt;/code&gt;，默认 &lt;code&gt;auto-trailing-slash&lt;/code&gt; 正好适配 Hugo 的 &lt;code&gt;/p/slug/&lt;/code&gt; 这种漂亮 URL。&lt;/li&gt;
&lt;li&gt;纯静态、没有 Worker 脚本 → &lt;strong&gt;不要&lt;/strong&gt;写 &lt;code&gt;&amp;quot;binding&amp;quot;: &amp;quot;ASSETS&amp;quot;&lt;/code&gt;（那是配合 &lt;code&gt;main&lt;/code&gt; 用的）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;② 控制台（Workers &amp;amp; Pages → Create application → Continue with GitHub）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来的流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Continue with GitHub&lt;/strong&gt; → 弹 GitHub 授权页 → 授权 Cloudflare 的 GitHub App（仓库权限建议选 &lt;code&gt;Only select repositories&lt;/code&gt;，只勾 &lt;code&gt;xxxxxx.github.io&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回到 Cloudflare 选仓库&lt;/strong&gt; → &lt;code&gt;xxxxxx.github.io&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build command&lt;/strong&gt; 填：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git submodule update --init --recursive &amp;amp;&amp;amp; hugo --minify --gc ${HUGO_BASEURL:+--baseURL &amp;#34;$HUGO_BASEURL/&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;Advanced settings&lt;/strong&gt; 填：&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;项&lt;/th&gt;
 &lt;th&gt;值&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Root directory&lt;/td&gt;
 &lt;td&gt;留空&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Build variables and secrets&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;HUGO_VERSION&lt;/code&gt; = &lt;code&gt;0.154.5&lt;/code&gt;（&lt;strong&gt;必填&lt;/strong&gt;）；&lt;code&gt;HUGO_BASEURL&lt;/code&gt; = &lt;code&gt;https://foreveryang.xxxxx.workers.dev/&lt;/code&gt;（不知道就先不建）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API token&lt;/td&gt;
 &lt;td&gt;保持默认（Create new token）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;strong&gt;两个开关&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enable Preview builds&lt;/strong&gt; → 保持默认开启。它只对“非 main 分支”生效，你平时只推 main，不额外耗构建分钟；以后开分支试版式就能拿预览 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protect with Cloudflare Access&lt;/strong&gt; → &lt;strong&gt;必须关&lt;/strong&gt;。这是给内部/私密站点套 Zero Trust 登录的，开了访客要先登录才能看博客。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;③ 点部署后，日志里核对三行&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hugo 版本 = &lt;code&gt;0.154.5&lt;/code&gt;（证明 &lt;code&gt;HUGO_VERSION&lt;/code&gt; 生效，没退到镜像默认的 &lt;code&gt;0.147.7&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;没有 &lt;code&gt;Unable to find theme &amp;quot;hugo-bearneo&amp;quot;&lt;/code&gt;（submodule 拉下来了）；&lt;/li&gt;
&lt;li&gt;末尾 &lt;code&gt;wrangler deploy&lt;/code&gt; 成功，并给出 &lt;code&gt;https://xxxxxxxx.&amp;lt;子域&amp;gt;.workers.dev&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;之后就是把域名发给 AI，让它确认就可以了。Cloudflare 的 workers 域名国内网络访问不了，可以自行使用自定义域名。&lt;/p&gt;
&lt;h2 id="github-怎么自定义域名"&gt;GitHub 怎么自定义域名&lt;/h2&gt;
&lt;h3 id="关键顺序别做反"&gt;关键顺序（别做反）&lt;/h3&gt;
&lt;p&gt;GitHub 官方明确要求：&lt;strong&gt;先在仓库里填好域名，再去 DNS 加记录&lt;/strong&gt;，反了有子域名被人抢注的风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① GitHub（先做）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://github.com/mythstraw/mythstraw.github.io/settings/pages&lt;/code&gt; → Custom domain 填：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;blog.foreveryang.top
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;→ Save&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 腾讯云 DNSPod（后做）&lt;/strong&gt; 添加记录：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;主机记录&lt;/th&gt;
 &lt;th&gt;记录类型&lt;/th&gt;
 &lt;th&gt;记录值&lt;/th&gt;
 &lt;th&gt;线路&lt;/th&gt;
 &lt;th&gt;TTL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;blog&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;CNAME&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;xxxxxx.github.io&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;默认&lt;/td&gt;
 &lt;td&gt;600&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;记录值不带仓库名、也不要填 Settings 里那个 &lt;code&gt;*.pages.github.io&lt;/code&gt; 的临时地址。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;③ 生效后&lt;/strong&gt;（几分钟 ~ 24h）回 Pages 页勾 &lt;strong&gt;Enforce HTTPS&lt;/strong&gt;（证书签发还要几分钟）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;④ 让 AI 自行检查去触发一次构建&lt;/strong&gt;：仓库 Actions → &lt;em&gt;Deploy Hugo site to Pages&lt;/em&gt; → Run workflow（或随便 push 一篇文章）。构建时 &lt;code&gt;configure-pages&lt;/code&gt; 会把 baseURL 自动换成新域名，canonical / &lt;code&gt;index.xml&lt;/code&gt; / favicon 就都是 &lt;code&gt;blog.foreveryang.top&lt;/code&gt; 了。&lt;/p&gt;</description></item><item><title>使用 Hugo + GitHub 部署博客</title><link>https://blog.foreveryang.top/p/hugo-github-deploy/</link><pubDate>Sun, 27 Sep 2026 10:11:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/p/hugo-github-deploy/</guid><description>&lt;h2 id="一hugo-是什么"&gt;一、Hugo 是什么？&lt;/h2&gt;
&lt;p&gt;Hugo 是一个用 Go 语言编写的静态网站生成器（SSG），自 2013 年发布以来，以其&lt;strong&gt;极快的构建速度&lt;/strong&gt;和&lt;strong&gt;简单的部署方式&lt;/strong&gt;在开发者社区中广受欢迎。&lt;/p&gt;
&lt;h3 id="-hugo-的核心优势"&gt;⚡ Hugo 的核心优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极致的构建速度&lt;/strong&gt;：这是 Hugo 最突出的标签。由于采用 Go 语言编译，它的构建速度在同类工具中处于领先地位。根据基准测试，构建一个包含 5,000 页的网站，Hugo 仅需约 &lt;strong&gt;2.1 秒&lt;/strong&gt;，而 Jekyll 则需要约 &lt;strong&gt;4 分钟&lt;/strong&gt;。对于内容量大的站点，这个优势会非常明显。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单的部署与零依赖&lt;/strong&gt;：Hugo 以单个二进制文件的形式分发，你下载后即可使用，无需安装 Ruby、Node.js 等运行时环境或处理复杂的依赖关系。这使得它在任何操作系统上的安装和部署都极其简单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内置丰富功能&lt;/strong&gt;：Hugo 自带了许多开箱即用的功能，例如多语言支持、强大的分类系统（Tags/Categories）、图片处理管道以及对 SASS/SCSS 的原生支持，无需依赖外部插件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-hugo-的局限性"&gt;⚠️ Hugo 的局限性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模板系统学习曲线较陡&lt;/strong&gt;：Hugo 使用 Go 语言的 &lt;code&gt;html/template&lt;/code&gt; 语法，对于不熟悉 Go 的开发者来说，其语法和逻辑可能不太直观，相比 Jekyll 的 Liquid 或 Hexo 的 EJS 等模板语言，需要更多的学习时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺乏官方插件系统&lt;/strong&gt;：Hugo 没有像 Jekyll 或 Hexo 那样成熟的插件生态系统。虽然可以通过 Shortcodes、主题和 Hugo Modules 进行扩展，但实现高度自定义的功能时，可能不如有插件系统的工具灵活。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题生态相对有限&lt;/strong&gt;：虽然 Hugo 拥有超过 900 个主题，但与 Hexo 等拥有庞大社区和丰富主题数量的工具相比，其主题库在数量和一些特定需求的覆盖上可能稍显不足。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-与其他主流工具的横向对比"&gt;🔍 与其他主流工具的横向对比&lt;/h3&gt;
&lt;p&gt;为了更直观地展示差异，下表汇总了 Hugo 与几款主流 SSG 的核心特性：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;编程语言&lt;/th&gt;
 &lt;th&gt;构建速度&lt;/th&gt;
 &lt;th&gt;学习曲线&lt;/th&gt;
 &lt;th&gt;核心优势&lt;/th&gt;
 &lt;th&gt;最适合场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Go&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;极快&lt;/strong&gt; (毫秒/秒级)&lt;/td&gt;
 &lt;td&gt;中等&lt;/td&gt;
 &lt;td&gt;速度最快、单二进制、零依赖&lt;/td&gt;
 &lt;td&gt;大型站点、内容密集型网站、追求极致性能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Jekyll&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Ruby&lt;/td&gt;
 &lt;td&gt;较慢 (分钟级)&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;GitHub Pages 原生支持、成熟的插件生态&lt;/td&gt;
 &lt;td&gt;简单的博客、GitHub Pages 托管&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hexo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;丰富的插件和主题生态、对 JS 开发者友好&lt;/td&gt;
 &lt;td&gt;个人博客、Node.js 技术栈用户&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Gatsby&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript (React)&lt;/td&gt;
 &lt;td&gt;较慢&lt;/td&gt;
 &lt;td&gt;陡峭&lt;/td&gt;
 &lt;td&gt;强大的 React 组件和 GraphQL 数据层&lt;/td&gt;
 &lt;td&gt;复杂的 React 应用、需要大量动态交互的站点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript (多框架)&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;默认零 JS、支持多框架组件、内容驱动&lt;/td&gt;
 &lt;td&gt;现代内容网站、电商落地页、追求最小化 JS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Eleventy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;配置灵活、不依赖特定前端框架、对 JS 生态友好&lt;/td&gt;
 &lt;td&gt;偏好 JS 工具链的开发者、注重灵活性的项目&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;综合来看，Hugo 的核心竞争力在于 &lt;strong&gt;“速度”&lt;/strong&gt; 和 &lt;strong&gt;“简洁”&lt;/strong&gt;。它非常适合以下场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内容量大、更新频繁的博客或文档站点&lt;/strong&gt;：构建速度的优势会极大提升开发体验和部署效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不想深入折腾前端工具链的开发者&lt;/strong&gt;：单二进制文件、零依赖的特性让部署和维护变得非常简单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对网站性能有极致要求的场景&lt;/strong&gt;：Hugo 生成的静态站点本身就非常轻量，配合 CDN 可以轻松获得极快的加载速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二整体部署流程概述简单了解"&gt;二、整体部署流程概述（简单了解）&lt;/h2&gt;
&lt;p&gt;使用 Hugo 和 GitHub 部署博客，整个流程可以概括为：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在本地用 Hugo 生成静态网站 → 通过 Git 推送到 GitHub 仓库 → 再由 GitHub Actions 自动构建并发布到 GitHub Pages。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="-整体流程概览"&gt;🧭 整体流程概览&lt;/h3&gt;
&lt;p&gt;整个部署管线大致分为四个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地环境搭建&lt;/strong&gt;：安装 Hugo 和 Git。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建与配置站点&lt;/strong&gt;：初始化 Hugo 站点，选择并配置主题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编写与预览内容&lt;/strong&gt;：用 Markdown 写文章，本地启动服务预览。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接 GitHub 并自动化部署&lt;/strong&gt;：将代码推送到 GitHub，配置 Actions 自动构建和发布。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤一准备工作与本地搭建"&gt;🛠️ 步骤一：准备工作与本地搭建&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装必要工具&lt;/strong&gt;&lt;br&gt;
你需要在本地安装 &lt;strong&gt;Hugo&lt;/strong&gt;（建议安装 &lt;strong&gt;extended&lt;/strong&gt; 扩展版，因为许多主题依赖 SCSS 支持）和 &lt;strong&gt;Git&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;: &lt;code&gt;brew install hugo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;scoop install hugo-extended&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;: &lt;code&gt;sudo snap install hugo&lt;/code&gt; 或 &lt;code&gt;sudo apt install hugo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建 Hugo 站点并初始化 Git&lt;/strong&gt;&lt;br&gt;
在终端中运行以下命令，创建一个名为 &lt;code&gt;my-blog&lt;/code&gt; 的站点，并初始化 Git 仓库：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new site my-blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择并安装主题&lt;/strong&gt;&lt;br&gt;
Hugo 有丰富的主题生态，中文友好的热门主题包括 &lt;strong&gt;PaperMod&lt;/strong&gt;、&lt;strong&gt;LoveIt&lt;/strong&gt;、&lt;strong&gt;hugo-theme-stack&lt;/strong&gt; 等。以 PaperMod 为例，通过 Git 子模块安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，在站点配置文件 &lt;code&gt;hugo.toml&lt;/code&gt;（或 &lt;code&gt;config.toml&lt;/code&gt;）中启用主题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PaperMod&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基础站点配置&lt;/strong&gt;&lt;br&gt;
编辑 &lt;code&gt;hugo.toml&lt;/code&gt;，至少设置以下关键项：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;baseURL&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://你的用户名.github.io/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;languageCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;我的博客&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤二编写内容与本地预览"&gt;✍️ 步骤二：编写内容与本地预览&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建新文章&lt;/strong&gt;&lt;br&gt;
使用 &lt;code&gt;hugo new&lt;/code&gt; 命令创建文章，它会根据模板自动生成 Front Matter（元数据）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new posts/my-first-post.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开生成的文件，将 &lt;code&gt;draft: true&lt;/code&gt; 改为 &lt;code&gt;false&lt;/code&gt;，文章才会被正式发布。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;本地预览&lt;/strong&gt;&lt;br&gt;
启动 Hugo 内置的开发服务器，实时预览效果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;访问 &lt;code&gt;http://localhost:1313/&lt;/code&gt; 即可查看。&lt;code&gt;-D&lt;/code&gt; 参数表示包含草稿文章。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤三推送到-github-并启用-pages"&gt;🚀 步骤三：推送到 GitHub 并启用 Pages&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建 GitHub 仓库&lt;/strong&gt;&lt;br&gt;
在 GitHub 上新建一个仓库。&lt;strong&gt;关键点&lt;/strong&gt;：如果你希望博客地址是 &lt;code&gt;https://你的用户名.github.io&lt;/code&gt;，仓库名应设置为 &lt;code&gt;你的用户名.github.io&lt;/code&gt;；如果是项目站点，仓库名可以任意，但地址会多一级子路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推送本地代码&lt;/strong&gt;&lt;br&gt;
在本地仓库中添加远程地址并推送：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin https://github.com/你的用户名/仓库名.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Initial commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启用 GitHub Pages&lt;/strong&gt;&lt;br&gt;
进入仓库的 &lt;strong&gt;Settings &amp;gt; Pages&lt;/strong&gt;，将 &lt;strong&gt;Source&lt;/strong&gt; 从 “Deploy from a branch” 改为 &lt;strong&gt;“GitHub Actions”&lt;/strong&gt;。这个改动是立即生效的，无需保存按钮。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤四配置-github-actions-自动部署"&gt;⚙️ 步骤四：配置 GitHub Actions 自动部署&lt;/h3&gt;
&lt;p&gt;这是实现“推送即部署”的核心。你需要创建一个 GitHub Actions 工作流文件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建工作流文件&lt;/strong&gt;&lt;br&gt;
在站点根目录下创建 &lt;code&gt;.github/workflows/hugo.yaml&lt;/code&gt; 文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置工作流内容&lt;/strong&gt;&lt;br&gt;
将以下官方示例内容粘贴进去（注意根据你的 Hugo 版本和分支名微调）。这个工作流会在你向 &lt;code&gt;main&lt;/code&gt; 分支推送代码时，自动安装 Hugo、构建站点并部署到 GitHub Pages：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deploy Hugo site to Pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;read&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;write&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id-token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;write&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;HUGO_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.147.9&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Install Hugo CLI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Checkout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;submodules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;recursive&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fetch-depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Setup Pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/configure-pages@v5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Build with Hugo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;HUGO_CACHEDIR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ runner.temp }}/hugo_cache&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;HUGO_ENVIRONMENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; hugo \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --minify \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --baseURL &amp;#34;${{ steps.pages.outputs.base_url }}/&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Upload artifact&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/upload-pages-artifact@v3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./public&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;github-pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ steps.deployment.outputs.page_url }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;needs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deploy to GitHub Pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/deploy-pages@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推送并触发部署&lt;/strong&gt;&lt;br&gt;
提交这个工作流文件并推送到 GitHub。推送后，GitHub Actions 会自动开始运行。你可以在仓库的 &lt;strong&gt;Actions&lt;/strong&gt; 标签页下查看构建和部署的实时日志。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-后续写作与发布流程"&gt;🔄 后续写作与发布流程&lt;/h3&gt;
&lt;p&gt;完成上述配置后，你日常的写作和发布流程会非常简洁：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地写作&lt;/strong&gt;：用 &lt;code&gt;hugo new posts/文章名.md&lt;/code&gt; 创建文章，用 Markdown 编辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地预览&lt;/strong&gt;：&lt;code&gt;hugo server -D&lt;/code&gt; 确认效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一键发布&lt;/strong&gt;：&lt;code&gt;git add . &amp;amp;&amp;amp; git commit -m &amp;quot;更新文章&amp;quot; &amp;amp;&amp;amp; git push&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;推送后，GitHub Actions 会在云端自动完成构建和部署，几分钟后你的博客就会更新。&lt;/p&gt;
&lt;h3 id="-关键提醒"&gt;💡 关键提醒&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;baseURL&lt;/code&gt; 配置&lt;/strong&gt;：务必在 &lt;code&gt;hugo.toml&lt;/code&gt; 中正确设置 &lt;code&gt;baseURL&lt;/code&gt;，否则部署后可能出现样式或链接错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题更新&lt;/strong&gt;：如果通过 Git 子模块安装主题，在克隆仓库或 Actions 中构建时，需要使用 &lt;code&gt;--recursive&lt;/code&gt; 参数来拉取主题代码，上述工作流示例中已包含 &lt;code&gt;submodules: recursive&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义域名&lt;/strong&gt;：如果你绑定了自定义域名，需要在仓库的 Pages 设置中配置，并相应调整 &lt;code&gt;baseURL&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三hugo-其他安装方式"&gt;三、Hugo 其他安装方式&lt;/h2&gt;
&lt;p&gt;Hugo 还支持免本地安装的构建和部署方式。得益于其“单二进制文件”的设计，你可以将构建过程完全放在云端完成，本地只需要一个浏览器和 Git 即可。&lt;/p&gt;
&lt;h3 id="-方式一利用-github-actions-自动构建"&gt;☁️ 方式一：利用 GitHub Actions 自动构建&lt;/h3&gt;
&lt;p&gt;只需要在项目仓库中配置好 GitHub Actions 工作流（如之前封装好的 &lt;code&gt;hugo.yaml&lt;/code&gt;），每次将 Markdown 源文件推送到 GitHub 后，Actions 的虚拟环境会自动安装 Hugo、构建站点并部署到 GitHub Pages。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心配置&lt;/strong&gt;：&lt;br&gt;
在 &lt;code&gt;hugo.yaml&lt;/code&gt; 中，你只需要通过 &lt;code&gt;peaceiris/actions-hugo@v3&lt;/code&gt; 这个 Action 来按需安装指定版本的 Hugo（支持 extended 版本和 Hugo Modules），它会在几秒内完成安装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Setup Hugo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;peaceiris/actions-hugo@v3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hugo-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0.147.9&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，你的本地环境就完全不需要 Hugo，只需负责编写 Markdown 和推送代码。&lt;/p&gt;
&lt;h3 id="-方式二使用-docker-容器"&gt;🐳 方式二：使用 Docker 容器&lt;/h3&gt;
&lt;p&gt;如果你需要在本地进行&lt;strong&gt;实时预览&lt;/strong&gt;，但不想直接安装 Hugo 到系统里，Docker 是最佳选择。&lt;/p&gt;
&lt;p&gt;你可以直接运行官方的 Hugo Docker 镜像，将本地项目目录挂载到容器中，即可在容器内执行 &lt;code&gt;hugo server&lt;/code&gt; 命令。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 示例：使用官方镜像启动本地预览服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -it &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:/src &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 1313:1313 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ghcr.io/gohugoio/hugo:latest server --bind 0.0.0.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种方式将 Hugo 的运行环境隔离在容器内，不会污染你的主机系统，同时还能获得完整的本地开发体验。&lt;/p&gt;
&lt;h3 id="-方式三使用云构建服务平台"&gt;🚀 方式三：使用云构建服务平台&lt;/h3&gt;
&lt;p&gt;一些静态网站托管平台（如 &lt;strong&gt;Netlify&lt;/strong&gt;、&lt;strong&gt;Vercel&lt;/strong&gt;、&lt;strong&gt;EdgeOne Pages&lt;/strong&gt; 等）内置了对 Hugo 的支持。&lt;/p&gt;
&lt;p&gt;你只需要将 GitHub 仓库连接到这些平台，它们会自动检测到这是一个 Hugo 项目，并在云端完成构建和部署，实现真正的“零配置”持续集成。&lt;/p&gt;
&lt;p&gt;对于“Hugo + GitHub”的博客方案，&lt;strong&gt;使用 GitHub Actions 进行云端构建是最简洁、最一致的路径&lt;/strong&gt;。你的本地角色可以简化为“内容创作者”，只需专注于用 Markdown 写作和 &lt;code&gt;git push&lt;/code&gt; 即可。&lt;/p&gt;
&lt;h2 id="四使用-ai-工具自动部署"&gt;四、使用 AI 工具自动部署&lt;/h2&gt;
&lt;p&gt;下面是一个完整的 Skill 技能，整合了 &lt;strong&gt;Hugo 博客部署&lt;/strong&gt; 和 &lt;strong&gt;自定义编辑&lt;/strong&gt; 两大流程。你只需将整个 &lt;code&gt;hugo-blog-manager&lt;/code&gt; 文件夹放入任何 agent 的 &lt;code&gt;skills/&lt;/code&gt; 目录，即可通过自然语言触发。&lt;/p&gt;
&lt;p&gt;我用的是 nanobot，其他 AI 工具一样，&lt;strong&gt;保险起见可以让 AI 对 skill 做一次校验&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-目录结构"&gt;📁 目录结构&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;skills/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── hugo-blog-manager/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── _common.ps1 # 公共函数：DryRun 预演、hugo 定位、UTF-8 写文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── check_env.ps1 # 只读环境体检
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── install_hugo.ps1 # 安装 hugo（本地 winget / Docker）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── init_site.ps1 # 新建站点 + git init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── install_theme.ps1 # 装主题并写入 theme:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── preview.ps1 # hugo server 本地预览
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── push_github.ps1 # 提交并推送
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── setup_actions.ps1 # 生成 GitHub Actions 部署 workflow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;脚本全部是 PowerShell（Windows 原生，不依赖 WSL / Git Bash），并且&lt;strong&gt;每个脚本都带 &lt;code&gt;-DryRun&lt;/code&gt;&lt;/strong&gt;：只打印将要执行的命令，不做任何改动。这就是整个 Skill「确认式执行」的地基——先预演给用户看，用户点头了才实跑。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="-skillmd"&gt;📄 SKILL.md&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: hugo-blog-manager
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: 管理 Hugo 博客：从零创建站点、选装主题、推送 GitHub 并配置 GitHub Actions 自动部署到 GitHub Pages；以及安全地修改现有站点的内容、Front Matter、布局、样式和配置（先给 diff 再逐步确认，hugo server 本地预览，构建或发布失败排错）。当用户说“部署 Hugo 博客”“新建 Hugo 站点”“修改 Hugo 页面”“改页脚”“加关于页”“博客发不出去/Pages 404”或提到 Hugo、GitHub Pages、hugo.yaml 时使用。安装 Hugo 本体必须先让用户在“本地安装 / Docker 安装”之间选择；主题必须在安装那一刻现场询问用户。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nanobot:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; emoji: 📝
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; requires:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bins: [&amp;#34;git&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Hugo 博客管理器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;两个工作流：**流程 A 部署新博客**、**流程 B 安全修改现有站点**。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;脚本目录（下文记作 &lt;span class="sb"&gt;`$S`&lt;/span&gt;，调用时替换成这个技能的真实路径）：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$S = &amp;lt;skills&amp;gt;\hugo-blog-manager\scripts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;运行时的当前目录不是技能目录，**调用脚本必须用绝对路径**。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 两条硬性规则
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Hugo 本体安装必须先问用户**&lt;/span&gt;。只能在用户明确选择「本地安装」（winget &lt;span class="sb"&gt;`Hugo.Hugo.Extended`&lt;/span&gt;）或「Docker 安装」（拉 hugo 镜像，用 &lt;span class="sb"&gt;`docker run`&lt;/span&gt; 跑）之后，才通过 &lt;span class="sb"&gt;`install_hugo.ps1`&lt;/span&gt; 执行。不要自动安装，不要替用户选。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**主题必须现场问用户**&lt;/span&gt;。本技能不预设任何主题。走到装主题那一步时，先给 3~4 个候选（各自特点 + 仓库地址）让用户挑，选定后才跑 &lt;span class="sb"&gt;`install_theme.ps1`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 确认式执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;每个关键节点三步走：先跑 &lt;span class="sb"&gt;`-DryRun`&lt;/span&gt; → 把命令和影响讲给用户 → 用户明确同意后去掉 &lt;span class="sb"&gt;`-DryRun`&lt;/span&gt; 实跑。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 全局前置检查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```powershell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;\check_env.ps1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;只读体检（hugo / git / docker / winget），退出码 &lt;span class="sb"&gt;`0`&lt;/span&gt;=就绪、&lt;span class="sb"&gt;`1`&lt;/span&gt;=hugo 缺失、&lt;span class="sb"&gt;`2`&lt;/span&gt;=git 缺失、&lt;span class="sb"&gt;`3`&lt;/span&gt;=两者都缺。hugo 缺失时**不要自己装**，转去问用户选哪种方式：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```powershell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;\install_hugo.ps1&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Method&lt;/span&gt; &lt;span class="n"&gt;Local&lt;/span&gt; &lt;span class="n"&gt;-DryRun&lt;/span&gt; &lt;span class="c"&gt;# 本地安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;\install_hugo.ps1&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Method&lt;/span&gt; &lt;span class="n"&gt;Docker&lt;/span&gt; &lt;span class="n"&gt;-DryRun&lt;/span&gt; &lt;span class="c"&gt;# Docker 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;装完重跑 &lt;span class="sb"&gt;`check_env.ps1`&lt;/span&gt; 确认；本地安装后若 &lt;span class="sb"&gt;`hugo`&lt;/span&gt; 仍不可见，提醒用户新开终端刷新 PATH。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 流程 A：部署新博客
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;按顺序走，每步先 DryRun 再等确认。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**环境检查**&lt;/span&gt; —— 见上。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**确定站点位置与标题**&lt;/span&gt; —— 问用户博客放哪个目录、叫什么名字（&lt;span class="sb"&gt;`baseURL`&lt;/span&gt; 后续可改）。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**创建站点**&lt;/span&gt;：&lt;span class="sb"&gt;`init_site.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -Title &amp;#34;&amp;lt;标题&amp;gt;&amp;#34;`&lt;/span&gt; → &lt;span class="sb"&gt;`hugo new site --format yaml`&lt;/span&gt; + &lt;span class="sb"&gt;`git init -b main`&lt;/span&gt; + 写 &lt;span class="sb"&gt;`hugo.yaml`&lt;/span&gt; 与 &lt;span class="sb"&gt;`.gitignore`&lt;/span&gt;。目标目录必须为空，脚本拒绝覆盖已有内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**选主题（必须先问用户）**&lt;/span&gt;：&lt;span class="sb"&gt;`install_theme.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -ThemeName &amp;lt;名&amp;gt; -ThemeRepo &amp;lt;仓库地址&amp;gt;`&lt;/span&gt;。默认走 &lt;span class="sb"&gt;`git submodule`&lt;/span&gt;（主题可后续升级）；GitHub 不可达时脚本会报错并提示改用 &lt;span class="sb"&gt;`-Mode Zip -ZipUrl &amp;lt;镜像 zip 地址&amp;gt;`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**本地预览，交给用户确认**&lt;/span&gt;：&lt;span class="sb"&gt;`preview.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34;`&lt;/span&gt;（&lt;span class="sb"&gt;`hugo server`&lt;/span&gt;，默认 http://127.0.0.1:1313/）。这是前台长进程，用后台会话跑；**界面效果必须由用户在浏览器确认**，不要用 HTTP 探测 localhost 代替。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;6.&lt;/span&gt; &lt;span class="gs"&gt;**建 GitHub 仓库**&lt;/span&gt;（让用户在网页端建，**不要勾 README / .gitignore**），然后推送：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`push_github.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -RepoUrl https://github.com/&amp;lt;user&amp;gt;/&amp;lt;repo&amp;gt;.git -Message &amp;#34;Initial commit: Hugo blog&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;7.&lt;/span&gt; &lt;span class="gs"&gt;**配置自动部署**&lt;/span&gt;：&lt;span class="sb"&gt;`setup_actions.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34;`&lt;/span&gt; 写 &lt;span class="sb"&gt;`.github/workflows/hugo.yaml`&lt;/span&gt; 并推送。Hugo 版本自动取自本地 hugo 或 hugo 容器，也可 &lt;span class="sb"&gt;`-HugoVersion x.y.z`&lt;/span&gt; 指定。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;8.&lt;/span&gt; &lt;span class="gs"&gt;**收尾**&lt;/span&gt;：提醒用户去仓库 &lt;span class="sb"&gt;`Settings → Pages → Source`&lt;/span&gt; 选 &lt;span class="gs"&gt;**GitHub Actions**&lt;/span&gt;（一次性手动步骤），之后每次 push 自动发布。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 流程 B：安全修改现有站点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**先读再动**&lt;/span&gt;。定位改动点：&lt;span class="sb"&gt;`hugo.yaml`&lt;/span&gt;（站点配置）、&lt;span class="sb"&gt;`content/`&lt;/span&gt;（文章 / Front Matter）、&lt;span class="sb"&gt;`layouts/`&lt;/span&gt;（模板覆盖）、&lt;span class="sb"&gt;`assets/`&lt;/span&gt; 与 &lt;span class="sb"&gt;`static/`&lt;/span&gt;（样式、静态资源）、&lt;span class="sb"&gt;`themes/&amp;lt;主题&amp;gt;/`&lt;/span&gt;（主题源码）。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**主题是外部代码（submodule），默认不改它内部文件**&lt;/span&gt;。优先在站点根目录放同名文件覆盖（Hugo 的 lookup order），例如 &lt;span class="sb"&gt;`layouts/partials/footer.html`&lt;/span&gt;。确实必须改主题内部时，先说明代价（升级会被覆盖，或需要 fork）再决定。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**每处改动都是三步**&lt;/span&gt;：读原文 → 把 diff（改什么、为什么、影响哪些页面）给用户看 → 等确认 → 再改。一次只改一处，别攒一堆一起改。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**改完必看**&lt;/span&gt;：&lt;span class="sb"&gt;`preview.ps1`&lt;/span&gt; 让用户在浏览器确认效果；改模板时可用 &lt;span class="sb"&gt;`-Drafts`&lt;/span&gt; 连草稿一起看。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**用户认可后再提交**&lt;/span&gt;：&lt;span class="sb"&gt;`push_github.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -RepoUrl &amp;lt;origin&amp;gt; -Message &amp;#34;&amp;lt;改了什么&amp;gt;&amp;#34;`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;6.&lt;/span&gt; &lt;span class="gs"&gt;**不可逆操作先备份**&lt;/span&gt;：删内容、换主题、改 &lt;span class="sb"&gt;`baseURL`&lt;/span&gt;、重写 git 历史之前，先复制目录或开新分支。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### 常见排错
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **Pages 404 / 页面不更新**：仓库 &lt;span class="sb"&gt;`Settings → Pages → Source`&lt;/span&gt; 必须是 &lt;span class="sb"&gt;`GitHub Actions`&lt;/span&gt;；&lt;span class="sb"&gt;`baseURL`&lt;/span&gt; 与实际域名不一致时由 workflow 的 &lt;span class="sb"&gt;`--baseURL`&lt;/span&gt; 兜底。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **样式没生效**：核对主题的 &lt;span class="sb"&gt;`assets`&lt;/span&gt; / &lt;span class="sb"&gt;`static`&lt;/span&gt; 目录结构，以及 &lt;span class="sb"&gt;`hugo.yaml`&lt;/span&gt; 里的 &lt;span class="sb"&gt;`theme`&lt;/span&gt; 值与 &lt;span class="sb"&gt;`themes/`&lt;/span&gt; 下的目录名是否一致。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **构建失败**：看 Actions 日志；本地 hugo 版本与主题要求不匹配时，用 &lt;span class="sb"&gt;`setup_actions.ps1 -HugoVersion`&lt;/span&gt; 重新生成 workflow。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **CI 里主题目录是空的**：workflow 的 checkout 已带 &lt;span class="sb"&gt;`submodules: recursive`&lt;/span&gt;；若仍为空，确认 &lt;span class="sb"&gt;`.gitmodules`&lt;/span&gt; 已提交进仓库。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **用户站点仓库（&lt;span class="sb"&gt;`&amp;lt;user&amp;gt;.github.io`&lt;/span&gt;）**：&lt;span class="sb"&gt;`baseURL`&lt;/span&gt; 必须是根域名（如 &lt;span class="sb"&gt;`https://mythstraw.github.io/`&lt;/span&gt;）；私有仓库开 Pages 需付费，必须 public。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Hugo 陷阱速查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`T`&lt;/span&gt; / &lt;span class="sb"&gt;`i18n`&lt;/span&gt; 返回值会被 HTML 转义 → 翻译串含 &lt;span class="sb"&gt;`&amp;lt;a&amp;gt;`&lt;/span&gt; 时必须 &lt;span class="sb"&gt;`| safeHTML`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 模板内链接用 &lt;span class="sb"&gt;`.RelPermalink`&lt;/span&gt;；&lt;span class="sb"&gt;`relURL`&lt;/span&gt; 在带语言前缀时会重复加前缀。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 首页 &lt;span class="sb"&gt;`.Title`&lt;/span&gt; 为空 → 判断首页必须用 &lt;span class="sb"&gt;`.IsHome`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; front matter 不写 &lt;span class="sb"&gt;`slug`&lt;/span&gt; 时 Hugo 用**标题**做 URL（中文标题 → 百分号编码）→ 每篇显式写 &lt;span class="sb"&gt;`slug`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`buildFuture=false`&lt;/span&gt;（默认）：&lt;span class="sb"&gt;`date`&lt;/span&gt; 写成未来时间会被整篇跳过。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 用 Docker 跑 hugo 必须把站点子目录挂成工作目录（挂整盘会报 &amp;#34;Unable to locate config file&amp;#34;）。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 脚本清单
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 脚本 | 作用 | 关键参数 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| --- | --- | --- |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`check_env.ps1`&lt;/span&gt; | 只读环境体检 | &lt;span class="sb"&gt;`-Json`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`install_hugo.ps1`&lt;/span&gt; | 安装 hugo（**须用户先选方式**） | &lt;span class="sb"&gt;`-Method Local\|Docker`&lt;/span&gt;、&lt;span class="sb"&gt;`-StartEngine`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`init_site.ps1`&lt;/span&gt; | 新建站点 + git init + 配置 + .gitignore | &lt;span class="sb"&gt;`-SitePath`&lt;/span&gt;、&lt;span class="sb"&gt;`-Title`&lt;/span&gt;、&lt;span class="sb"&gt;`-BaseUrl`&lt;/span&gt;、&lt;span class="sb"&gt;`-LanguageCode`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`install_theme.ps1`&lt;/span&gt; | 装主题并写入 &lt;span class="sb"&gt;`theme:`&lt;/span&gt;（**主题须现场问用户**） | &lt;span class="sb"&gt;`-ThemeName`&lt;/span&gt;、&lt;span class="sb"&gt;`-ThemeRepo`&lt;/span&gt;、&lt;span class="sb"&gt;`-Mode Submodule\|Zip`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`preview.ps1`&lt;/span&gt; | &lt;span class="sb"&gt;`hugo server`&lt;/span&gt; 本地预览 | &lt;span class="sb"&gt;`-Port`&lt;/span&gt;、&lt;span class="sb"&gt;`-Drafts`&lt;/span&gt;、&lt;span class="sb"&gt;`-BindAddress`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`push_github.ps1`&lt;/span&gt; | 提交并推送到 GitHub | &lt;span class="sb"&gt;`-RepoUrl`&lt;/span&gt;、&lt;span class="sb"&gt;`-Branch`&lt;/span&gt;、&lt;span class="sb"&gt;`-Message`&lt;/span&gt;、&lt;span class="sb"&gt;`-Rebase`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`setup_actions.ps1`&lt;/span&gt; | 生成 GitHub Actions 部署 workflow | &lt;span class="sb"&gt;`-HugoVersion`&lt;/span&gt;、&lt;span class="sb"&gt;`-Branch`&lt;/span&gt;、&lt;span class="sb"&gt;`-NoPush`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="-脚本关键片段"&gt;🔧 脚本关键片段&lt;/h3&gt;
&lt;p&gt;为控制篇幅，下面是各脚本的关键部分（真代码节选，&lt;code&gt;# ...&lt;/code&gt; 表示省略；完整脚本见文末下载）。&lt;/p&gt;
&lt;h4 id="scripts_commonps1"&gt;&lt;code&gt;scripts/_common.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这段是整个技能的核心：&lt;strong&gt;本机装了 hugo 就直接跑，没装但 Docker 引擎在跑就用容器跑&lt;/strong&gt;——两种安装方式共用同一套脚本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 有原生 hugo 就原生跑；没有原生 hugo 但 Docker 引擎在跑，就用容器跑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Invoke-Hugo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;Mandatory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)][&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$SitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;Mandatory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)][&lt;/span&gt;&lt;span class="no"&gt;string[]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$HugoArgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$MountPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugomods/hugo:exts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string[]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$ExtraDockerArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;native&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cd &amp;#34;{0}&amp;#34;; hugo {1}&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$SitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$HugoArgs&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DRY-RUN: &lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 实跑，退出码非 0 就抛错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$MountPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$SitePath&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$src&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ConvertTo-PosixPath&lt;/span&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt; &lt;span class="c"&gt;# E:\myblog -&amp;gt; /e/myblog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$dkArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;run&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--rm&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$ExtraDockerArgs&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-v&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;${src}&lt;/span&gt;&lt;span class="s2"&gt;:/src&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/src&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$HugoArgs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DRY-RUN: docker &amp;#39;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dkArgs&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 实跑，退出码非 0 就抛错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo is not available: neither a native &amp;#39;hugo&amp;#39; executable nor a running Docker engine was found. Run install_hugo.ps1 first (ask the user to choose Local or Docker).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptscheck_envps1"&gt;&lt;code&gt;scripts/check_env.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;只读体检，靠&lt;strong&gt;退出码&lt;/strong&gt;把结论告诉 agent：&lt;code&gt;0&lt;/code&gt;=就绪、&lt;code&gt;1&lt;/code&gt;=hugo 缺失、&lt;code&gt;2&lt;/code&gt;=git 缺失、&lt;code&gt;3&lt;/code&gt;=两者都缺。缺 hugo 时打印的是「去问用户选哪种方式」，而不是自己去装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$hugo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt; &lt;span class="c"&gt;# native / docker / none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-GitExe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$docker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Test-DockerEngine&lt;/span&gt; &lt;span class="c"&gt;# client / engine / version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hugo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;git&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# exit code: 0 ready, 1 hugo missing, 2 git missing, 3 both missing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$exitCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$exitCode&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;git&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$exitCode&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NEXT: hugo is missing. Do NOT install silently - ask the user to pick one:&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; A) local install : powershell -NoProfile -File install_hugo.ps1 -Method Local (winget Hugo.Hugo.Extended)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; B) docker install : powershell -NoProfile -File install_hugo.ps1 -Method Docker (needs Docker Desktop running)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptsinstall_hugops1"&gt;&lt;code&gt;scripts/install_hugo.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;两种安装方式（&lt;code&gt;-Method Local|Docker&lt;/code&gt;），都要求用户先表态。装完自己复检一次，而不是假设成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Method&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Local&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$wgArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;install&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$WingetId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--accept-source-agreements&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--accept-package-agreements&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DRY-RUN: {0} {1}&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$winget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$wgArgs&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$winget&lt;/span&gt; &lt;span class="nv"&gt;@wgArgs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$after&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;native&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;OK: hugo {0} -&amp;gt; {1}&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 仍不可见时给出提示（下载被墙、需刷新 PATH、或改用 Docker）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Docker 方式：引擎没起时可加 -StartEngine，最多等 240 秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$docker&lt;/span&gt; &lt;span class="n"&gt;pull&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$docker&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-rm&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptsinit_siteps1"&gt;&lt;code&gt;scripts/init_site.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;新建站点前的唯一硬校验：&lt;strong&gt;目标目录必须是空的&lt;/strong&gt;，宁可报错也不碰已有内容。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-Path&lt;/span&gt; &lt;span class="n"&gt;-LiteralPath&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$entries&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-ChildItem&lt;/span&gt; &lt;span class="n"&gt;-LiteralPath&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Count&lt;/span&gt; &lt;span class="o"&gt;-gt&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Target directory is not empty: &lt;/span&gt;&lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="s2"&gt;. Pick another path, or clean it up first (refusing to touch existing content).&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-Hugo&lt;/span&gt; &lt;span class="n"&gt;-SitePath&lt;/span&gt; &lt;span class="nv"&gt;$parent&lt;/span&gt; &lt;span class="n"&gt;-MountPath&lt;/span&gt; &lt;span class="nv"&gt;$parent&lt;/span&gt; &lt;span class="n"&gt;-Image&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="n"&gt;-DryRun:&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-HugoArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;new&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;site&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$leaf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;yaml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 新站点没有需要保留的内容，直接写一份干净的 hugo.yaml（theme: 留到装主题那步再写）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$config&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;@&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;baseURL: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BaseUrl&lt;/span&gt;&lt;span class="sh"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;languageCode: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LanguageCode&lt;/span&gt;&lt;span class="sh"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;title: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$Title&lt;/span&gt;&lt;span class="sh"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;&amp;#34;@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Utf8File&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$configPath&lt;/span&gt; &lt;span class="n"&gt;-Content&lt;/span&gt; &lt;span class="nv"&gt;$config&lt;/span&gt; &lt;span class="c"&gt;# UTF-8 无 BOM，避免中文标题乱码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptsinstall_themeps1"&gt;&lt;code&gt;scripts/install_theme.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;默认 &lt;code&gt;git submodule&lt;/code&gt;（主题可后续升级）；&lt;code&gt;github.com&lt;/code&gt; 不可达时不硬顶，改走 &lt;code&gt;-Mode Zip&lt;/code&gt; 从镜像下载。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 先探活：不通就明确告诉用户「加速器没开」或「改用 -Mode Zip」&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$probe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="nb"&gt;ls-remote&lt;/span&gt; &lt;span class="nv"&gt;$ThemeRepo&lt;/span&gt; &lt;span class="n"&gt;HEAD&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cannot reach &lt;/span&gt;&lt;span class="nv"&gt;$ThemeRepo&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;submodule&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="nv"&gt;$ThemeRepo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;themes/&lt;/span&gt;&lt;span class="nv"&gt;$ThemeName&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;submodule&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-init&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-recursive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# -Mode Zip 分支：下载 + 解压到 themes/&amp;lt;名&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="nv"&gt;$ZipUrl&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="nv"&gt;$tmpZip&lt;/span&gt; &lt;span class="n"&gt;-UseBasicParsing&lt;/span&gt; &lt;span class="n"&gt;-TimeoutSec&lt;/span&gt; &lt;span class="mf"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Expand-Archive&lt;/span&gt; &lt;span class="n"&gt;-LiteralPath&lt;/span&gt; &lt;span class="nv"&gt;$tmpZip&lt;/span&gt; &lt;span class="n"&gt;-DestinationPath&lt;/span&gt; &lt;span class="nv"&gt;$tmpDir&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 把 theme: 写进配置（已有就替换，没有就追加）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="o"&gt;-match&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(?m)^\s*theme\s*[:=]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$newContent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(?m)^\s*theme\s*[:=].*$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Utf8File&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$configPath&lt;/span&gt; &lt;span class="n"&gt;-Content&lt;/span&gt; &lt;span class="nv"&gt;$newContent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptspreviewps1"&gt;&lt;code&gt;scripts/preview.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;本地预览。Docker 模式下有个坑：容器内得监听 &lt;code&gt;0.0.0.0&lt;/code&gt;，端口只发布到宿主机回环地址，否则外面打不开。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo is not available. Run check_env.ps1, then ask the user to choose Local or Docker install.&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 容器模式：容器内监听 0.0.0.0，端口发布在宿主机回环地址上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$innerBind&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$BindAddress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$extra&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$innerBind&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0.0.0.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$extra&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{0}:{1}:{1}&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$BindAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$hugoArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--port&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--bind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$innerBind&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Drafts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$hugoArgs&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-D&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptspush_githubps1"&gt;&lt;code&gt;scripts/push_github.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;三道保险：身份没配不提交、工作区干净不算失败、远端已有提交时&lt;strong&gt;默认中止&lt;/strong&gt;（要显式加 &lt;code&gt;-Rebase&lt;/code&gt;）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 1) git 身份没配就中止，绝不以未知作者提交&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="o"&gt;-or&lt;/span&gt; &lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;git user.name / user.email are not configured. Ask the user for them and re-run with -GitUserName / -GitUserEmail.&amp;#39;&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 2) 工作区干净就跳过 commit（不是报错）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-porcelain&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="vm"&gt;$null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;commit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 3) 远端已有提交时中止，除非显式 -Rebase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$remoteHeads&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="nb"&gt;ls-remote&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-heads&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="vm"&gt;$null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$remoteHeads&lt;/span&gt; &lt;span class="o"&gt;-and&lt;/span&gt; &lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$Rebase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Remote is not empty. Re-run with -Rebase to pull remote commits first, or push to another repo/branch.&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pull&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--rebase&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;origin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;push&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-u&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;origin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-AllowFail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptssetup_actionsps1"&gt;&lt;code&gt;scripts/setup_actions.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Hugo 版本不写死：优先用 &lt;code&gt;-HugoVersion&lt;/code&gt;，否则从本地 hugo 或 hugo 容器里探测，保证 CI 用和你本地一致的版本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;native&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoVersionFromString&lt;/span&gt; &lt;span class="n"&gt;-Text&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$raw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Exe&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-rm&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="vm"&gt;$null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoVersionFromString&lt;/span&gt; &lt;span class="n"&gt;-Text&lt;/span&gt; &lt;span class="nv"&gt;$raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 模板里占位，再替换成真实版本号与分支，UTF-8 无 BOM 写出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__HUGO_VERSION__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__BRANCH__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Utf8File&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$workflowPath&lt;/span&gt; &lt;span class="n"&gt;-Content&lt;/span&gt; &lt;span class="nv"&gt;$workflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 交给 push_github.ps1 提交推送（复用同一套身份/远端/分支保护）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Join-Path&lt;/span&gt; &lt;span class="nv"&gt;$PSScriptRoot&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;push_github.ps1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-SitePath&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;-RepoUrl&lt;/span&gt; &lt;span class="nv"&gt;$remote&lt;/span&gt; &lt;span class="n"&gt;-Message&lt;/span&gt; &lt;span class="nv"&gt;$Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="-使用方式"&gt;🚀 使用方式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;解压后把整个 &lt;code&gt;hugo-blog-manager&lt;/code&gt; 文件夹放进 nanobot 工作区的 &lt;code&gt;skills/&lt;/code&gt; 目录（Windows 下不用 &lt;code&gt;chmod&lt;/code&gt;，PowerShell 脚本直接就能跑）。&lt;/li&gt;
&lt;li&gt;对 nanobot 说：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;部署新博客&lt;/strong&gt;：“部署 Hugo 博客”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改现有博客&lt;/strong&gt;：“修改 Hugo 页脚”、“添加关于页面”等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nanobot 会自动加载 Skill，按对应流程逐步询问并执行——每个节点都是「先 &lt;code&gt;-DryRun&lt;/code&gt; 给你看命令 → 你确认 → 才真正执行」。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="-下载这个-skill"&gt;📦 下载这个 Skill&lt;/h3&gt;
&lt;p&gt;上面第四节贴的只是节选，完整脚本（7 个脚本 + 公共函数，含全部边界检查、退出码与排错提示）打包在这里：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://mythstraw.github.io/downloads/hugo-blog-manager.zip" target="_blank" rel="noopener noreferrer"&gt;⬇️ 下载 hugo-blog-manager.zip&lt;/a&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下载后解压，把整个 &lt;code&gt;hugo-blog-manager&lt;/code&gt; 文件夹放进 nanobot 工作区的 &lt;code&gt;skills/&lt;/code&gt; 目录，重启会话即可自动加载。&lt;/p&gt;</description></item></channel></rss>