<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GitHub-Actions on dongxiaoqi's Blog</title><link>https://notion.dongxiaoqi.top/tags/github-actions/</link><description>Recent content in GitHub-Actions on dongxiaoqi's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>CC BY-NC-SA 4.0</copyright><lastBuildDate>Thu, 13 Aug 2026 12:21:00 +0800</lastBuildDate><atom:link href="https://notion.dongxiaoqi.top/tags/github-actions/index.xml" rel="self" type="application/rss+xml"/><item><title>博客主题从 MemE 切换到 Stack 实录</title><link>https://notion.dongxiaoqi.top/p/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98%E4%BB%8E-meme-%E5%88%87%E6%8D%A2%E5%88%B0-stack-%E5%AE%9E%E5%BD%95/</link><pubDate>Wed, 12 Aug 2026 12:45:00 +0800</pubDate><guid>https://notion.dongxiaoqi.top/p/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98%E4%BB%8E-meme-%E5%88%87%E6%8D%A2%E5%88%B0-stack-%E5%AE%9E%E5%BD%95/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;一次完整的话题切换实操记录：从 MemE 换到 hugo-theme-stack，顺带把被钉死的 Hugo 老版本解锁。包含三个真实踩坑和 CI 迭代验证过程。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一背景"&gt;一、背景
&lt;/h2&gt;&lt;p&gt;博客原本用 MemE 主题（git submodule，钉在 2022 年的 v5.0.0）。MemE v5.0.0 用了旧版 &lt;code&gt;resources.ToCSS&lt;/code&gt; API，与新版 Hugo 不兼容，导致 CI 工作流被迫把 Hugo 钉在 &lt;code&gt;0.112.7&lt;/code&gt;——这是个 2023 年的老版本，越来越难维护，新特性也用不了。&lt;/p&gt;
&lt;p&gt;目标：换成更现代的主题，并顺带解除旧 Hugo 版本锁。&lt;/p&gt;
&lt;h2 id="二选型"&gt;二、选型
&lt;/h2&gt;&lt;p&gt;候选了三个主流主题，最终选 &lt;strong&gt;hugo-theme-stack&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;卡片式文章列表、左侧边栏、原生暗色模式切换&lt;/li&gt;
&lt;li&gt;维护活跃，文档完善&lt;/li&gt;
&lt;li&gt;要求 Hugo ≥ 0.157.0 extended，正好顺带升级&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三改动清单"&gt;三、改动清单
&lt;/h2&gt;&lt;h3 id="1-替换主题-submodule"&gt;1. 替换主题 submodule
&lt;/h3&gt;&lt;p&gt;移除 MemE，新增 Stack 并锁定到稳定 tag：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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 deinit -f themes/meme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git rm -f themes/meme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf .git/modules/themes/meme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add -b master https://github.com/CaiJimmy/hugo-theme-stack.git themes/stack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/stack checkout v4.0.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-重写-configtoml"&gt;2. 重写 config.toml
&lt;/h3&gt;&lt;p&gt;从 1432 行的 MemE 配置精简到约 210 行。关键调整：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;theme = &amp;quot;stack&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mainSections = [&amp;quot;zh&amp;quot;]&lt;/code&gt;：核心，让首页读 &lt;code&gt;content/zh/&lt;/code&gt;（Notion Action 同步目录，不改 Action 也不改清理脚本）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[permalinks] zh = &amp;quot;/p/:slug/&amp;quot;&lt;/code&gt;：用 Stack 默认 URL 风格，文章 URL 从 &lt;code&gt;/zh/xxx/&lt;/code&gt; 变 &lt;code&gt;/p/xxx/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[menu]&lt;/code&gt; 改成 Stack 的 &lt;code&gt;main&lt;/code&gt; + &lt;code&gt;social&lt;/code&gt; 格式&lt;/li&gt;
&lt;li&gt;删除 MemE 专属的 &lt;code&gt;[params]&lt;/code&gt;、&lt;code&gt;[outputFormats]&lt;/code&gt;、&lt;code&gt;[outputs]&lt;/code&gt; 等几百行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-重写-archetypesnotionmd"&gt;3. 重写 archetypes/notion.md
&lt;/h3&gt;&lt;p&gt;Notion Action 同步时套这个模板。改成 Stack 的 front matter 字段，两个关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;draft: false&lt;/code&gt;：Stack 默认 archetype 是 &lt;code&gt;draft: true&lt;/code&gt;，不显式改 false 的话同步出的文章会被当草稿隐藏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category&lt;/code&gt; → &lt;code&gt;categories&lt;/code&gt;（复数）：Stack 模板用 &lt;code&gt;.Params.categories&lt;/code&gt; 判断分类，单数 key 不会显示分类徽章&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-升级-hugo"&gt;4. 升级 Hugo
&lt;/h3&gt;&lt;p&gt;工作流里 &lt;code&gt;0.112.7&lt;/code&gt; → &lt;code&gt;0.163.3&lt;/code&gt;，&lt;code&gt;extended: true&lt;/code&gt; 保留。&lt;/p&gt;
&lt;h2 id="四踩坑记录"&gt;四、踩坑记录
&lt;/h2&gt;&lt;p&gt;整个过程走了三轮 CI 迭代，每个坑都是一次失败构建。&lt;/p&gt;
&lt;h3 id="坑-1计划里的-hugo-01572-根本不存在"&gt;坑 1：计划里的 Hugo 0.157.2 根本不存在
&lt;/h3&gt;&lt;p&gt;第一轮按计划填 &lt;code&gt;hugo-version: '0.157.2'&lt;/code&gt;，&lt;code&gt;peaceiris/actions-hugo&lt;/code&gt; 直接报错：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unable to find a compatible Hugo release asset for this runner.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查 Hugo releases 才发现：0.157 线&lt;strong&gt;只有 0.157.0&lt;/strong&gt;，之后直接跳到 0.160+，根本不存在 0.157.1/0.157.2。改成实际存在的 &lt;code&gt;0.163.3&lt;/code&gt;（成熟 .3 补丁版本，远高于 Stack 的 min 0.157.0）解决。&lt;/p&gt;
&lt;p&gt;教训：版本号要查 releases 确认存在，别想当然填补丁号。&lt;/p&gt;
&lt;h3 id="坑-2菜单图标不在-stack-内置集"&gt;坑 2：菜单图标不在 Stack 内置集
&lt;/h3&gt;&lt;p&gt;第二轮 Hugo 装上了，但构建报：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR Error: icon &amp;#39;code.svg&amp;#39; is not found under &amp;#39;assets/icons&amp;#39; folder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR Error: icon &amp;#39;notes.svg&amp;#39; is not found under &amp;#39;assets/icons&amp;#39; folder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;菜单里 &lt;code&gt;技术&lt;/code&gt; 用了 &lt;code&gt;icon = &amp;quot;code&amp;quot;&lt;/code&gt;、&lt;code&gt;随笔&lt;/code&gt; 用了 &lt;code&gt;icon = &amp;quot;notes&amp;quot;&lt;/code&gt;，但 Stack 只内置 24 个 SVG（&lt;code&gt;themes/stack/assets/icons/&lt;/code&gt;），不含 code/notes。改成内置图标：技术→&lt;code&gt;categories&lt;/code&gt;、随笔→&lt;code&gt;archives&lt;/code&gt;、关于→&lt;code&gt;user&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;教训：主题里引用的资源（图标、图片）要先确认主题是否自带，没有就得自己往 &lt;code&gt;assets/&lt;/code&gt; 放。&lt;/p&gt;
&lt;h3 id="坑-3languagecode-弃用警告"&gt;坑 3：languageCode 弃用警告
&lt;/h3&gt;&lt;p&gt;第三轮构建成功，但有 WARN：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN deprecated: project config key languageCode was deprecated in Hugo v0.158.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;修这个又踩了一层：顶层 &lt;code&gt;languageCode&lt;/code&gt; 在 0.158 弃用，移到 &lt;code&gt;[languages.zh].languageCode&lt;/code&gt; 后，0.163 又把这个键改名为 &lt;code&gt;locale&lt;/code&gt;（连同 &lt;code&gt;languageName&lt;/code&gt; → &lt;code&gt;label&lt;/code&gt;）。最终用最新键名：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;languages&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="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zh&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="nx"&gt;locale&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;label&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;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;额外风险：显式加 &lt;code&gt;[languages.zh]&lt;/code&gt; 后，Hugo 可能把 &lt;code&gt;content/zh/&lt;/code&gt; 当成 zh 语言根目录（而非 section），导致 &lt;code&gt;mainSections=[&amp;quot;zh&amp;quot;]&lt;/code&gt; 失配、首页变空。本地用下载的 hugo 二进制构建验证过：仍是 section，首页 2 篇文章、&lt;code&gt;/p/&lt;/code&gt; URL 都没变，才敢推 CI。&lt;/p&gt;
&lt;h2 id="五验证方法"&gt;五、验证方法
&lt;/h2&gt;&lt;p&gt;这次没用本地 &lt;code&gt;hugo server&lt;/code&gt; 预览，直接靠 CI 验证：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt; 后用 GitHub API 手动触发 &lt;code&gt;workflow_dispatch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;轮询 run 状态到 completed&lt;/li&gt;
&lt;li&gt;失败就下载日志 zip，定位报错步骤，修复重推&lt;/li&gt;
&lt;li&gt;成功后抓线上首页 HTML，核对 Stack 标记、文章链接、CSS/JS 资源是否 200&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;三轮迭代，每轮约 2–3 分钟，比反复起本地服务更快也更接近真实部署环境。&lt;/p&gt;
&lt;h2 id="六最终效果"&gt;六、最终效果
&lt;/h2&gt;&lt;p&gt;线上 &lt;a class="link" href="https://notion.dongxiaoqi.top/" target="_blank" rel="noopener"
 &gt;https://notion.dongxiaoqi.top/&lt;/a&gt; 已确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stack 外观：左侧边栏、卡片式文章列表、暗色模式切换&lt;/li&gt;
&lt;li&gt;首页正常显示 2 篇文章，URL 是 &lt;code&gt;/p/xxx/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文章页正文、标题、代码块、标签、阅读时长都正常&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tags/&lt;/code&gt; 三个标签（Hugo / Notion / GitHub-Pages）正常&lt;/li&gt;
&lt;li&gt;CSS（55KB）/ JS（8KB）资源都 200，无样式崩坏&lt;/li&gt;
&lt;li&gt;旧 &lt;code&gt;/zh/xxx/&lt;/code&gt; URL 已 404（符合预期，文章少无外链，可接受）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七语言切换器的实现"&gt;七、语言切换器的实现
&lt;/h2&gt;&lt;p&gt;主题切换上线后，照着 demo 站（demo.stack.cai.im）加了侧边栏的语言切换下拉框。这一节记录实现机制和一个非标准目录结构下踩的坑。&lt;/p&gt;
&lt;h3 id="机制hugoismultilingual"&gt;机制：hugo.IsMultilingual
&lt;/h3&gt;&lt;p&gt;Stack 的切换器在 themes/stack/layouts/_partials/sidebar/left.html，是一个 &lt;select&gt; 下拉框，遍历 .Site.Home.AllTranslations 生成 option，每个指向对应语言首页 URL、label 用 .Language.Label。但它被包在一个前置条件里：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;hugo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IsMultilingual&lt;/span&gt;&lt;span class="w"&gt; &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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;i18n-switch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也就是说，只有 Hugo 处于多语言模式（[languages] 里定义了 ≥2 种语言）时切换器才渲染。demo 站每种语言都有真实翻译内容，多语言模式天然开启，切换器自然出现。单语博客要显示它，就得显式加第二种语言。&lt;/p&gt;
&lt;h3 id="坑contentzh-当-section-用contenten-进不了英语语言"&gt;坑：content/zh 当 section 用，content/en 进不了英语语言
&lt;/h3&gt;&lt;p&gt;本站的内容目录结构是非标准的：文章在 content/zh/，靠 mainSections=[&amp;quot;zh&amp;quot;] + permalinks zh=&amp;quot;/p/:slug/&amp;quot; 让首页读到它、文章落在 /p/。这是为了不动 Notion Action 硬编码的 contentFolder。&lt;/p&gt;
&lt;p&gt;加第二种语言时本能地想建 content/en/ 放英语内容——但本地 hugo 实测发现行不通：默认语言 zh 且 defaultContentLanguageInSubdir=false 时，Hugo 从 content/ 根扫描，把 content/ 下所有子目录（含 content/en/）都当成 zh 的 section。结果 content/en/ 永远成不了英语语言根，英语首页 RegularPages=0，空列表。&lt;/p&gt;
&lt;p&gt;换成 defaultContentLanguageInSubdir=true 也没用，content/en/ 依旧被默认语言吞成 section（变成 /zh/en/posts/...）。这个坑用调试 partial 打印 .Site.RegularPages 的 type/url 才定位到。&lt;/p&gt;
&lt;h3 id="解法by-filename-后缀-enmd"&gt;解法：by-filename 后缀 .en.md
&lt;/h3&gt;&lt;p&gt;改用 Hugo 的 by-filename 机制：文件名带 .&lt;lang&gt;.md 后缀的会归对应语言，且继承所在目录的 section。英文欢迎页放在 content/zh/welcome.en.md——.en 后缀让它归英语语言，content/zh/ 目录让它共享 section &amp;quot;zh&amp;quot;，于是 mainSections 和 permalinks 完全不用改。&lt;/p&gt;
&lt;p&gt;效果：中文文章仍在 /p/:slug/（URL 零变化），英文欢迎页在 /en/p/welcome/，切换器选项 中文(/) ↔ English(/en/)。&lt;/p&gt;
&lt;h3 id="配套改动"&gt;配套改动
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;config.toml 加 [languages.en]（locale=&amp;quot;en-US&amp;quot;, label=&amp;quot;English&amp;quot;, weight=2），开启 IsMultilingual，切换器自动渲染。&lt;/li&gt;
&lt;li&gt;新建 content/zh/welcome.en.md：英文欢迎页，说明本站主语言为中文、英文版建设中，附返回中文首页的链接。&lt;/li&gt;
&lt;li&gt;工作流清理脚本加 TRANSLATION_SUFFIXES=(&amp;quot;.en.md&amp;quot;,) 跳过翻译文件——否则每次 CI 会 git rm 掉欢迎页（Notion Action 不产生 .en.md，它不在 expected 集合里）。已实测：found 2 .md file(s); 0 to delete，欢迎页安全。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="后续加英文内容"&gt;后续加英文内容
&lt;/h3&gt;&lt;p&gt;想加英文文章，按同样规则放 content/zh/&lt;name&gt;.en.md 即可，自动出现在 /en/ 列表、URL 为 /en/p/&lt;name&gt;/。若英文文章多了，建议重新评估是否把 Notion 同步改成真正的多语言结构（那是另一个项目）。&lt;/p&gt;
&lt;h2 id="八遗留事项"&gt;八、遗留事项
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分类徽章不显示&lt;/strong&gt;：现有两篇文章 front matter 是 &lt;code&gt;category: 首页&lt;/code&gt;（单数 key），Stack 读 &lt;code&gt;categories&lt;/code&gt;（复数）。新 archetype 已改复数，下次 Notion 重新同步时自动修好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notion token 安全&lt;/strong&gt;：集成 token 曾在对话中明文出现，建议去 Notion 重新生成并更新 GitHub 仓库的 &lt;code&gt;NOTION_TOKEN&lt;/code&gt; secret。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九关键命令速查"&gt;九、关键命令速查
&lt;/h2&gt;&lt;p&gt;触发 CI 构建（用仓库存储的 GitHub 凭据，无需 gh CLI）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;# 取 git credential 里的 token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;protocol=https\nhost=github.com\n\n&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; git credential fill &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;^password=&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^password=//&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 手动触发 workflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;ref&amp;#34;:&amp;#34;master&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://api.github.com/repos/vamViolet/notion-hugo-meme/actions/workflows/notion-blog.yml/dispatches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;下载某次 run 的日志（API 返回 302 到 S3，要跟跳转）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="nv"&gt;REDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -D - -o /dev/null -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://api.github.com/repos/vamViolet/notion-hugo-meme/actions/runs/&amp;lt;RUN_ID&amp;gt;/logs &lt;span class="se"&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; grep -i &lt;span class="s1"&gt;&amp;#39;^location:&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^[Ll]ocation: //&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -o logs.zip &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$REDIR&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;unzip logs.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>