<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://www.jerrynis.com/</id>
  <title type="text">JerryLife</title>
  <subtitle type="text">enjoy life</subtitle>
  <updated>2026-10-05T00:00:00.000Z</updated>
  <author><name>Jerrynis</name></author>
  <link rel="alternate" href="https://www.jerrynis.com/"/>
  <link rel="self" href="https://www.jerrynis.com/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://www.jerrynis.com/posts/root/root/</id>
      <title type="text">安卓Root的选择与使用教程指南</title>
      <published>2026-10-05T00:00:00.000Z</published>
      <updated>2026-10-05T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/root/root/"/>
      <summary type="text">本文介绍了目前各个主流Root管理器的原理以及使用方法，如何对安卓手机进行root操作</summary>
      <content type="html"><![CDATA[<section><h2>一、先搞清楚：Root 到底是什么<a href="#一先搞清楚root-到底是什么"><span>#</span></a></h2><p>很多人以为「Root」是某个 App，装上就够了。实际上它是<strong>一个框架 + 一个管理界面</strong>的统称：</p>

<table><thead><tr><th>组成</th><th>作用</th></tr></thead><tbody><tr><td><strong>Root 框架</strong></td><td>真正拿到 root 权限的那层代码（Magisk / KernelSU / APatch）</td></tr><tr><td><strong>管理器 App</strong></td><td>授予/撤销 App 的 root 权限、装模块、看日志的界面</td></tr><tr><td><strong>su 二进制</strong></td><td>其他 App 通过它申请提权</td></tr><tr><td><strong>模块（Modules）</strong></td><td>各种第三方扩展：去广告、改系统字体、装 Lsposed 框架等</td></tr></tbody></table><p>现在还在维护的主流框架只有三个：<strong>Magisk、KernelSU、APatch</strong>。老一代的 SuperSU、KingRoot、Root 守护程序（RootCloak）这类「改 system 分区」方案已经不适用于当前的安卓系统。</p><hr /></section>
<section><h2>二、三大框架对比<a href="#二三大框架对比"><span>#</span></a></h2><section><h3>2.1 核心差异<a href="#21-核心差异"><span>#</span></a></h3>

<table><thead><tr><th>维度</th><th>Magisk</th><th>KernelSU</th><th>APatch</th></tr></thead><tbody><tr><td><strong>root 位置</strong></td><td>用户空间，直接注入到 boot 镜像</td><td>内核空间，内核内置或 LKM 加载</td><td>内核空间，直接 patch 内核</td></tr><tr><td><strong>需要自定义内核</strong></td><td>否</td><td>否（用官方预编译 LKM）/ 是（GKI编译）</td><td>否</td></tr><tr><td><strong>修补的镜像</strong></td><td><code>boot.img</code></td><td><code>boot.img</code>或<code>init_boot.img</code></td><td><code>boot.img</code></td></tr><tr><td><strong>Zygisk</strong></td><td>原生支持</td><td>需另装 ZygiskNext</td><td>需另装 ZygiskNext</td></tr><tr><td><strong>模块生态</strong></td><td>历史久远，模块最全最多</td><td>原生模块仅数百个，但兼容大部分 Magisk 模块</td><td>原生模块较少，另支持 KPM 内核模块</td></tr><tr><td><strong>上手难度</strong></td><td>最低</td><td>中等</td><td>中等</td></tr><tr><td><strong>对银行 App 兼容性/隐藏能力</strong></td><td>需模块组合</td><td>最好（内核级授权）</td><td>较好</td></tr></tbody></table></section><section><h3>2.2 版本现状（截至 2026-10）<a href="#22-版本现状截至-2026-10"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>最新版本</th><th>发布日期</th><th>官方仓库</th></tr></thead><tbody><tr><td>Magisk</td><td><strong>v30.7</strong></td><td>2026-02-23</td><td><code>topjohnwu/Magisk</code></td></tr><tr><td>KernelSU</td><td><strong>v3.3.0</strong></td><td>2026-08-28</td><td><code>tiann/KernelSU</code></td></tr><tr><td>APatch</td><td><strong>11224</strong></td><td>2026-08-07</td><td><code>bmax121/APatch</code></td></tr><tr><td></td><td></td><td></td><td></td></tr></tbody></table><p><strong>Magisk v30.7 更新要点：</strong></p><ul>
<li>[MagiskInit] Support Android 16 QPR2 sepolicy format</li>
<li>[MagiskInit] Support using klogdump partition as pre-init storage</li>
<li>[Zygisk] Support Android 16 QPR2 and higher</li>
<li>[Zygisk] Support Android XR and some Nubia devices</li>
<li>[MagiskSU] Do not drop capabilities by default, even when switching to non-root UIDs. Explicitly use the argument to drop capabilities.<code>--drop-cap</code></li>
<li>[MagiskBoot] Better lzma format detection</li>
<li>[MagiskBoot] Fix various commandline argument parsing bugs</li>
</ul><p><strong>KernelSU v3.3.0 更新要点：</strong></p><ul>
<li>新增 <strong>x86_64 LKM</strong> 支持</li>
<li>新增 <strong>Android 17 + Linux 6.18</strong> 支持，修复 6.6 内核 backport 场景</li>
<li>从文件修补启动镜像时自动备份原始 stock image</li>
<li><code>su</code> 支持设置 SELinux context</li>
<li>官方 Release 直接提供预编译 <code>.ko</code>，覆盖内核版本：<strong>5.10 / 5.15 / 6.1 / 6.6 / 6.12 / 6.18</strong></li>
</ul><p><strong>Apatch 11224 更新要点：</strong></p><ul>
<li>修复已知问题</li>
</ul><hr /></section></section>
<section><h2>三、怎么选<a href="#三怎么选"><span>#</span></a></h2><section><h4>Magisk（含 Delta/Alpha）<a href="#magisk含-deltaalpha"><span>#</span></a></h4><ul>
<li>优点：生态最大，模块最多，LSPosed 最稳；新手首选；老机型（内核 &lt; 5.10）兼容性强；自带 Zygisk+Denylist，上手简单</li>
<li>缺点：底层权限不如内核级，部分强检测环境难隐藏</li>
<li><strong>适合</strong>：新手、普通模块玩家、老手机、不想折腾内核补丁、主要用 LSPosed</li>
</ul></section><section><h4>KernelSU（KSUN/SukiSU-Ultra 分支更强）<a href="#kernelsuksunsukisu-ultra-分支更强"><span>#</span></a></h4><ul>
<li>优点：内核级权限，隐藏上限高（搭配 SUSFS）；权限管控精细；现代 GKI 安卓（5.10+）首选内核 RootKernelSU</li>
<li>缺点：原生不带 Zygisk，需要 ZygiskNext；模块生态略少于 Magisk；老非 GKI 机型麻烦</li>
<li><strong>适合</strong>：GKI 新手机、需要强隐藏（银行 / 游戏检测）、内核模块玩家</li>
</ul></section><section><h4>APatch（首选FolkPatch分支，功能更多）<a href="#apatch首选folkpatch分支功能更多"><span>#</span></a></h4><ul>
<li>优点：<strong>支持超广内核 3.18~6.12</strong>，很多非 GKI 救星；内置 Magic Mount、KPM 自动加载；内核级路径隐藏；不需要预编译内核，直接 patch 原厂 boot</li>
<li>缺点：模块生态小于 Magisk；APatch 底层，玩机门槛更高；小众方案，出问题搜教程少</li>
<li><strong>适合</strong>：非 GKI 老机型、需要 KPM 内核补丁</li>
</ul><hr /><p><strong>一句话结论：</strong></p><ol>
<li><strong>第一次玩 Root / 手机内核低于 5.10 / 大量 Magisk 模块</strong> → <strong>Magisk</strong></li>
<li><strong>GKI 2.0 新机型，追求最强隐藏、内核级权限</strong> → <strong>KernelSU（SukiSU-Ultra）</strong></li>
<li><strong>老机型非 GKI、内核 3.18~5.4，想上内核级 Root</strong> → <strong>APatch（FolkPatch）</strong></li>
</ol><hr /></section></section>
<section><h2>四、安装前的准备<a href="#四安装前的准备"><span>#</span></a></h2><section><h3>4.1安装驱动并下载Fastboot\adb工具<a href="#41安装驱动并下载fastbootadb工具"><span>#</span></a></h3><p>前往<a href="https://lsdy.top/azqd" target="_blank">一键安装安卓驱动-官网</a>下载一键安装adb\fastboot驱动程序，并进行安装</p><p>前往<a href="https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn" target="_blank">SDK 平台工具版本说明  |  Android Studio  |  Android Developers</a>下载适用于自己设备的工具</p></section><section><h3>4.2 解锁 Bootloader<a href="#42-解锁-bootloader"><span>#</span></a></h3><p><strong>这是唯一的硬门槛</strong>，三种方案都需要，且无法绕过。</p><ul>
<li>
<p><strong>解锁会清空手机全部数据</strong></p>
</li>
<li>
<p>解锁后厂商保修基本作废</p>
</li>
<li>
<p><strong>三星的 Knox 熔断是永久的</strong>，刷机也刷不回来：<code>设置 → 关于手机 → Knox 保证位</code> 会显示 <code>0x1</code></p>
</li>
</ul><p>各厂商解锁渠道：</p>

<table><thead><tr><th>品牌</th><th>方式</th></tr></thead><tbody><tr><td>Google Pixel</td><td><code>fastboot flash unlock</code>（<code>fastboot</code> 模式下音量下 + 电源，或 <code>adb reboot bootloader</code>）</td></tr><tr><td>小米 / 红米</td><td>目前已封死解锁渠道，部分机型可通过芯片后门解锁</td></tr><tr><td>一加 / 真我</td><td>音量下 + 电源进 fastboot，<code>fastboot flashing unlock</code></td></tr><tr><td>三星</td><td>下载模式音量下 + 侧边键 → 屏幕提示 <code>Unlock</code> 长按</td></tr><tr><td>OPPO / vivo</td><td>需提交工单申请，审核通过后下解锁文件</td></tr></tbody></table></section><section><h3>4.3 完整备份<a href="#43-完整备份"><span>#</span></a></h3><p>解锁前把这些都备好，别指望解锁后还能取回：</p><ul>
<li>
<p> 照片、视频、聊天记录（微信/QQ 迁移）</p>
</li>
<li>
<p> 各类 App 的本地数据（游戏存档、笔记、密码库）</p>
</li>
<li>
<p> 双重验证器的<strong>导出种子/备份码</strong></p>
</li>
</ul></section><section><h3>4.4 提取 stock 启动镜像（关键）<a href="#44-提取-stock-启动镜像关键"><span>#</span></a></h3><p>这是新手最容易翻车的地方：<strong>Android 13 以后，大部分机型不再把 ramdisk 放在 <code>boot.img</code>，而是拆到了 <code>init_boot.img</code>。</strong> 补错了镜像轻则没 Root，重则变砖。</p><p><strong>判断方法：</strong></p>

<table><thead><tr><th>检查项</th><th>结论</th></tr></thead><tbody><tr><td>机型发布时出厂系统于 Android 12 及更早</td><td>大概率是 <code>boot.img</code></td></tr><tr><td>机型发布时出厂系统于 Android 13 及以后</td><td>大概率是 <code>init_boot.img</code></td></tr><tr><td>解锁后手机型号变成 <code>a/b</code> 而不是 <code>a/b/c</code></td><td>说明是 GKI 2.0 机型 → <code>init_boot.img</code></td></tr><tr><td>用 Magisk 内置修补器时它自动选对了分区</td><td>直接用它的选择</td></tr></tbody></table><p><strong>提取方法一：全量包提取（推荐）</strong></p><p>去手机厂商官网或可信的固件聚合站，下载<strong>完整线刷包</strong>（<code>.zip</code> / <code>.ozip</code> / <code>.tgz</code>），而不是手机里更新用的增量包。解包后找到 <code>boot.img</code> 或 <code>init_boot.img</code>。</p><p><strong>提取方法二：自己 dump（需已Root）</strong></p><p>手机开机后，打开adb调试，利用数据线连接到电脑上，在adb工具目录打开终端，输入下面命令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>adb</span><span> </span><span>shell</span></div></div><div><div><div>2</div></div><div><span>su</span></div></div><div><div><div>3</div></div><div><span># 查询当前激活槽位（a/b分区）</span></div></div><div><div><div>4</div></div><div><span>getprop</span><span> </span><span>ro.boot.slot_suffix</span></div></div><div><div><div>5</div></div><div><span># 输出一般是 _a 或者 _b</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 例子：槽位是_a，则分区名 boot_a</span></div></div><div><div><div>8</div></div><div><span>dd</span><span> </span><span>if=/dev/block/boot_a</span><span> </span><span>of=/sdcard/boot.img</span></div></div><div><div><div>9</div></div><div><span># 如果是init_boot机型</span></div></div><div><div><div>10</div></div><div><span>dd</span><span> </span><span>if=/dev/block/init_boot_a</span><span> </span><span>of=/sdcard/init_boot.img</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行完成后，手机内部存储根目录就有镜像，adb pull 拉到电脑</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>adb</span><span> </span><span>pull</span><span> </span><span>/sdcard/boot.img</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>⚠️ 坑：<strong>必须读取当前 active 槽位！读错槽位拿到旧系统镜像，修补后直接卡 fastboot</strong></p><p><strong>提取方法三：从卡刷包解 payload.bin</strong></p><p>从卡刷包解压出payload.bin文件，利用<a href="https://toolbox.uotan.cn/" target="_blank">柚坛工具箱</a>提取<code>boot.img</code> 或 <code>init_boot.img</code></p><hr /></section></section>
<section><h2>五、Magisk 安装<a href="#五magisk-安装"><span>#</span></a></h2><section><h3>5.1 下载<a href="#51-下载"><span>#</span></a></h3><p><strong>从官方 GitHub 下载</strong>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://github.com/topjohnwu/Magisk/releases</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>下载Magisk-v30.7.apk，app-debug.apk为调试版应用</p></section><section><h3>5.2 修补镜像<a href="#52-修补镜像"><span>#</span></a></h3><p>一般设备修补Boot镜像即可</p><ol>
<li>Magisk App → 右上角 <code>安装</code></li>
<li>选择 <code>选择并修补一个文件</code></li>
<li>把 <code>boot.img</code> 或 <code>init_boot.img</code> 传到手机的根目录，选中它</li>
<li>等修补完成，输出文件在 <code>Download/magisk_patched-30700-xxxxx.img</code></li>
<li>将修补后的文件传输到fastboot工具目录</li>
</ol></section><section><h3>5.3 刷入<a href="#53-刷入"><span>#</span></a></h3><p>重启，开机时按住音量下+电源键进入Fastboot（线刷模式）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 如果你修补的是 boot.img</span></div></div><div><div><div>2</div></div><div><span>fastboot</span><span> </span><span>flash</span><span> </span><span>boot</span><span> </span><span>magisk_patched-30700-xxxxx.img</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 如果你修补的是 init_boot.img</span></div></div><div><div><div>5</div></div><div><span>fastboot</span><span> </span><span>flash</span><span> </span><span>magisk_patched-30700-xxxxx.img</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>fastboot</span><span> </span><span>reboot</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>如果卡在 <code>waiting for any device</code></strong>，可尝试更换数据线、USB口，如果还不行可重装驱动或重启电脑</p></section><section><h3>5.4 验证<a href="#54-验证"><span>#</span></a></h3><p>开机后打开 Magisk，首页应显示<strong>已安装的版本号</strong>，而不是 <code>N/A</code>。如果还是 <code>N/A</code>，说明：</p><ul>
<li>刷错了分区（该刷 <code>init_boot</code> 却刷了 <code>boot</code>）</li>
<li>或者刷的不是 stock 原版镜像</li>
</ul><hr /></section></section>
<section><h2>六、KernelSU 安装<a href="#六kernelsu-安装"><span>#</span></a></h2><section><h3>6.1 方式 A：修补 boot 镜像<a href="#61-方式-a修补-boot-镜像"><span>#</span></a></h3><p>前提：你的机型是 GKI 2.0，内核版本在官方 <code>.ko</code> 覆盖范围内（5.10 / 5.15 / 6.1 / 6.6 / 6.12 / 6.18）。</p><ol>
<li>下载 <code>KernelSU_v3.3.0_32601-release.apk</code> 并安装</li>
<li>打开软件， 点击上方未安装(点击安装)选项卡 → 选择文件并修补 → 选择LKM：如有提示说明本机LKM，则按照提示选择；若无KMI提示，则选择与自己内核版本一致的；若无自己需要的LKM，可去酷安等权威社区下载适用自己机型的LKM(.ko)文件 → 输出文件在<code>Download/kernelsu_patched-xxxxxxxx-xxxxxx.img</code></li>
<li>将修补后的镜像传输到电脑</li>
<li>进行与上文magisk一致的刷入镜像操作，并重启</li>
<li>重启后进入系统若管理器显示工作中，则Root完成</li>
</ol></section><section><h3>6.2 方式 B：使用GKI编译镜像<a href="#62-方式-b使用gki编译镜像"><span>#</span></a></h3><p>此方法需要他人预编译好的GKI镜像，可从酷安等权威社区获取(谨慎辨别，小心格机)。因为是在内核中编译了kernelsu的静态代码，所以隐藏效果最好。</p><p>旧机型(5.10一下)仅能通过此方法使用kernelsu及其分支进行root操作</p><p>刷入GKI镜像与上文一致，不过仅需刷boot镜像</p><hr /></section></section>
<section><h2>七、APatch 安装<a href="#七apatch-安装"><span>#</span></a></h2><p>apatch的安装是这三个管理器最需要谨慎对待的</p><ol>
<li>从官方下载 <code>APatch_11224_*.apk</code> 并安装</li>
<li>打开并选择需要修补的文件</li>
<li>选择性设定<strong>超级密钥</strong></li>
<li>开始修补</li>
<li>输出文件为<code>Download/apatch_patched-11224-xxxxxx_xxxx.img</code></li>
<li>刷入修补后的镜像，与上文刷入步骤一致</li>
</ol><p><strong>⚠️ APatch 的 SuperKey 注意事项：</strong></p><ul>
<li>忘记 SuperKey = 失去 Root，且<strong>无法通过任何官方途径找回</strong></li>
<li>建议存在密码管理器里，不要记在脑子里</li>
<li>不要用生日、连输次数这种弱密码，它是解 Root 锁的唯一凭据</li>
</ul><p><strong>APatch 特有优势：</strong> 支持 <strong>KPM（Kernel Patch Module）</strong> 内核级代码注入，隐藏性优良，这是 Magisk 和 KernelSU 都做不到的。同时兼容 Magisk 格式模块（APM）。</p><hr /></section>
<section><h2>八、救砖：卡在开机画面怎么办<a href="#八救砖卡在开机画面怎么办"><span>#</span></a></h2><p>极有可能是你刷错了镜像，刷回修补前的镜像即可</p><p>Root 后变砖绝大多数<strong>不是 Magisk/KernelSU 本身的问题，是模块的问题</strong>。</p><p>安卓自带安全模式，会<strong>禁用所有第三方模块</strong>，不删除任何数据。</p><ol>
<li>卡在开机 logo 时，长按电源键重启</li>
<li>开机震动 / 出现品牌 logo 瞬间，<strong>长按音量减</strong>，保持按住直到进入系统，屏幕左下角出现【安全模式】字样</li>
<li>进入系统后，打开 Magisk/KSU，卸载最近安装、导致卡开机的模块，重启退出安全模式</li>
</ol><blockquote><p>部分机型安全模式触发逻辑不一样：长按电源菜单里的重启按钮，弹出安全模式选项。</p></blockquote><hr /></section>
<section><h2>九、OTA 更新怎么处理<a href="#九ota-更新怎么处理"><span>#</span></a></h2><p>OTA更新前关闭所有模块，刷回原版镜像后进行OTA更新。更新完成后重新提取镜像进行修补，刷入镜像即可。</p><hr /></section>
<section><h2>十一、必须知道的四件事<a href="#十一必须知道的四件事"><span>#</span></a></h2><section><h3>1. Root 不是「免费性能提升」<a href="#1-root-不是免费性能提升"><span>#</span></a></h3><p>绝大多数 Root 方案对日常流畅度<strong>没有正向帮助</strong>，反而有轻微性能开销（守护进程、模块加载）。Root 的价值在于：去广告、改系统行为、装扩展框架、备份还原、应用逆向调试。别为了「更快」去 Root。</p></section><section><h3>2. Root 扩大了攻击面<a href="#2-root-扩大了攻击面"><span>#</span></a></h3><p>Root 之后，恶意 App 拿到 root 权限的门槛大幅降低。装 Root 后<strong>不要装来路不明的 APK</strong>，「Root 过的手机」本身就是高价目标。</p></section><section><h3>3. 别信任何「免解锁 Root」工具<a href="#3-别信任何免解锁-root工具"><span>#</span></a></h3><p>市面上宣称「不解锁、不清数据、不触发熔断」的工具，要么只提供<strong>重启即失效的临时 Root</strong>，要么就是钓鱼软件下 malware。真正免解锁的临时 Root 在锁 Bootloader 的设备上做不到持久化——重启就没了。</p></section><section><h3>4. 银行 App 与 Root 的兼容是长期博弈<a href="#4-银行-app-与-root-的兼容是长期博弈"><span>#</span></a></h3><p>今天能用不代表明天能用。<strong>最稳的做法是：日常机不 Root，专门刷一台备用机做 Root 实验</strong>，或者用双系统/独立用户空间隔离。别把主力机的支付功能押在社区模块的更新速度上。</p><hr /></section></section>
<section><h2>十二、分支<a href="#十二分支"><span>#</span></a></h2><p>这些管理器都有部分分支，分支拥有独特的UI或者功能。</p><p>其中kernelsu有<a href="https://github.com/KernelSU-Next/KernelSU-Next" target="_blank">KernelSU Next</a><a href="https://github.com/SukiSU-Ultra/SukiSU-Ultra" target="_blank">SukiSUUltra</a>、<a href="https://resukisu.org/" target="_blank">ReSukiSU</a>。</p><p>APatch有<a href="https://github.com/LyraVoid/FolkPatch" target="_blank">FolkPatch</a></p><hr /></section>
<section><h2>总结<a href="#总结"><span>#</span></a></h2>

<table><thead><tr><th>你的情况</th><th>选什么</th><th>走哪条安装路径</th></tr></thead><tbody><tr><td>第一次 Root / 想用 LSPosed</td><td><strong>Magisk</strong></td><td>内置修补器 patch <code>init_boot</code> → fastboot 刷入</td></tr><tr><td>银行 App 刚需 + 机型有 <code>.ko</code></td><td><strong>KernelSU</strong></td><td>官方预编译 LKM 打进内核</td></tr><tr><td>刷了带 KSU 的第三方 ROM</td><td><strong>KernelSU</strong></td><td>Manager 直接装</td></tr><tr><td>前两者都不行、你是进阶用户</td><td><strong>APatch</strong></td><td>patch 内核，牢记superkey</td></tr><tr><td>只是想让 App 少点广告</td><td>试试 NewPipe / 无广告前端</td><td>不用 Root</td></tr></tbody></table><p><strong>行动顺序永远是：1.备份 → 2.解锁 → 3.提取并保存 stock 镜像 → 4.修补 → 5.刷入 → 6.验证</strong></p><p>跳过第 1、3 步，后面任何一步失败都会让你失去退路。</p><p>—本文使用AI进行润色和信息补充，若有错误请指出—</p></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/add-change-log/</id>
      <title type="text">为Firefly博客加入「更新日志」页面，记录并展示每一次的Git提交修改</title>
      <published>2026-08-29T00:00:00.000Z</published>
      <updated>2026-08-29T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/add-change-log/"/>
      <summary type="text">本文介绍如何为Firefly博客接入更新日志界面，记录Git提交，让站主与游客了解博客的更新历程。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>闲的没事用AI搓出来的，有BUG可以在评论指出</p></section>
<section><h1>功能说明<a href="#功能说明"><span>#</span></a></h1><p>新增一个 <code>/changelog/</code> 页面，<strong>自动读取 git 提交历史</strong>并渲染成更新日志：</p><ul>
<li>按<strong>日期倒序分组</strong></li>
<li>提交按 <strong>Conventional Commits 前缀自动分类</strong>并上色（后文有详细说明）</li>
<li>默认展开<strong>最近 10 天</strong>，更早的自动折叠为 <code>&lt;details&gt;</code> 可展开</li>
<li>每次 <code>pnpm build</code> 自动刷新数据</li>
</ul></section>
<section><h1>涉及文件<a href="#涉及文件"><span>#</span></a></h1>

<table><thead><tr><th>文件</th><th>说明</th></tr></thead><tbody><tr><td><code>scripts/generate-changelog.mjs</code></td><td>生成数据脚本（读 git log → 写 <code>src/constants/changelog.json</code>）</td></tr><tr><td><code>src/pages/changelog.astro</code></td><td>更新日志页面本体</td></tr><tr><td><code>src/constants/changelog.json</code></td><td>数据文件（脚本自动生成）</td></tr><tr><td><code>src/config/siteConfig.ts</code></td><td>加页面开关</td></tr><tr><td><code>src/types/siteConfig.ts</code></td><td>加类型定义</td></tr><tr><td><code>src/config/navBarConfig.ts</code></td><td>导航栏加入口</td></tr><tr><td><code>package.json</code></td><td>build 脚本开头接入生成步骤</td></tr></tbody></table></section>
<section><h1>添加步骤<a href="#添加步骤"><span>#</span></a></h1><section><h3>放入生成脚本<a href="#放入生成脚本"><span>#</span></a></h3><p>在<code>你的博客/scripts</code>中新建文件<code>generate-changelog.mjs</code>并输入下列内容</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* 更新日志数据生成脚本</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* 读取 git 提交历史，按日期倒序分组，输出到 src/constants/changelog.json</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* 页面 src/pages/changelog.astro 读取渲染</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>*</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>* 用法：node scripts/generate-changelog.mjs</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>8</div></div><div><span>import</span><span> { </span><span>spawnSync</span><span> } </span><span>from</span><span> </span><span>"node:child_process"</span><span>;</span></div></div><div><div><div>9</div></div><div><span>import</span><span> { </span><span>writeFileSync</span><span>, </span><span>mkdirSync</span><span> } </span><span>from</span><span> </span><span>"node:fs"</span><span>;</span></div></div><div><div><div>10</div></div><div><span>import</span><span> { </span><span>join</span><span>, </span><span>dirname</span><span> } </span><span>from</span><span> </span><span>"node:path"</span><span>;</span></div></div><div><div><div>11</div></div><div><span>import</span><span> { </span><span>fileURLToPath</span><span> } </span><span>from</span><span> </span><span>"node:url"</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>const</span><span> </span><span>__dirname</span><span> </span><span>=</span><span> </span><span>dirname</span><span>(</span><span>fileURLToPath</span><span>(</span><span>import</span><span>.</span><span>meta</span><span>.</span><span>url</span><span>));</span></div></div><div><div><div>14</div></div><div><span>const</span><span> </span><span>ROOT_DIR</span><span> </span><span>=</span><span> </span><span>join</span><span><span>(</span><span>__dirname</span><span>, </span></span><span>".."</span><span>);</span></div></div><div><div><div>15</div></div><div><span>const</span><span> </span><span>OUTPUT_FILE</span><span> </span><span>=</span><span> </span><span>join</span><span>(</span><span>ROOT_DIR</span><span>, </span><span>"src"</span><span>, </span><span>"constants"</span><span>, </span><span>"changelog.json"</span><span>);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>// 提交类型 → 中文标签（Conventional Commits 前缀）</span></div></div><div><div><div>18</div></div><div><span>const</span><span> </span><span>TYPE_LABELS</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>19</div></div><div><span>    </span><span>feat</span><span>:</span><span> </span><span>"新功能"</span><span>,</span></div></div><div><div><div>20</div></div><div><span>    </span><span>fix</span><span>:</span><span> </span><span>"修复"</span><span>,</span></div></div><div><div><div>21</div></div><div><span>    </span><span>perf</span><span>:</span><span> </span><span>"优化"</span><span>,</span></div></div><div><div><div>22</div></div><div><span>    </span><span>docs</span><span>:</span><span> </span><span>"文档"</span><span>,</span></div></div><div><div><div>23</div></div><div><span>    </span><span>refactor</span><span>:</span><span> </span><span>"重构"</span><span>,</span></div></div><div><div><div>24</div></div><div><span>    </span><span>style</span><span>:</span><span> </span><span>"样式"</span><span>,</span></div></div><div><div><div>25</div></div><div><span>    </span><span>test</span><span>:</span><span> </span><span>"测试"</span><span>,</span></div></div><div><div><div>26</div></div><div><span>    </span><span>build</span><span>:</span><span> </span><span>"构建"</span><span>,</span></div></div><div><div><div>27</div></div><div><span>    </span><span>ci</span><span>:</span><span> </span><span>"CI"</span><span>,</span></div></div><div><div><div>28</div></div><div><span>    </span><span>chore</span><span>:</span><span> </span><span>"杂项"</span><span>,</span></div></div><div><div><div>29</div></div><div><span>    </span><span>revert</span><span>:</span><span> </span><span>"回退"</span><span>,</span></div></div><div><div><div>30</div></div><div><span>    </span><span>merge</span><span>:</span><span> </span><span>"合并"</span><span>,</span></div></div><div><div><div>31</div></div><div><span>    </span><span>update</span><span>:</span><span> </span><span>"更新"</span><span>,</span></div></div><div><div><div>32</div></div><div><span>    </span><span>improve</span><span>:</span><span> </span><span>"改进"</span><span>,</span></div></div><div><div><div>33</div></div><div><span>};</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>function</span><span> </span><span>detectType</span><span><span>(</span><span>subject</span><span>) {</span></span></div></div><div><div><div>36</div></div><div><span>    </span><span>const</span><span> </span><span>m</span><span> </span><span>=</span><span><span> </span><span>subject</span><span>.</span></span><span>match</span><span>(</span><span>/</span><span>^</span><span>(</span><span>[a-z]</span><span><span>+</span><span>)(</span><span>\(</span></span><span>[</span><span>^</span><span>)]</span><span><span>*</span><span>\)</span><span>)</span><span>?</span></span><span>[:：]</span><span>/</span><span>);</span></div></div><div><div><div>37</div></div><div><span>    </span><span>if</span><span><span> (</span><span>m</span><span> </span></span><span>&amp;&amp;</span><span> </span><span>TYPE_LABELS</span><span><span>[</span><span>m</span><span>[</span></span><span>1</span><span>]]) </span><span>return</span><span><span> </span><span>m</span><span>[</span></span><span>1</span><span>];</span></div></div><div><div><div>38</div></div><div><span>    </span><span>return</span><span> </span><span>"other"</span><span>;</span></div></div><div><div><div>39</div></div><div><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>// 拉深历史（应对 CF Pages / CI 浅克隆 depth=1），失败忽略</span></div></div><div><div><div>42</div></div><div><span>spawnSync</span><span>(</span><span>"git"</span><span>, [</span><span>"fetch"</span><span>, </span><span>"--unshallow"</span><span>], {</span></div></div><div><div><div>43</div></div><div><span>    </span><span>cwd</span><span>:</span><span> </span><span>ROOT_DIR</span><span>,</span></div></div><div><div><div>44</div></div><div><span>    </span><span>stdio</span><span>:</span><span> </span><span>"ignore"</span><span>,</span></div></div><div><div><div>45</div></div><div><span>});</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>"读取 git 提交历史..."</span><span>);</span></div></div><div><div><div>48</div></div><div><span>const</span><span> </span><span>r</span><span> </span><span>=</span><span> </span><span>spawnSync</span><span>(</span><span>"git"</span><span>, [</span><span>"log"</span><span>, </span><span>"--pretty=format:%h|%aI|%an|%s"</span><span>], {</span></div></div><div><div><div>49</div></div><div><span>    </span><span>cwd</span><span>:</span><span> </span><span>ROOT_DIR</span><span>,</span></div></div><div><div><div>50</div></div><div><span>    </span><span>encoding</span><span>:</span><span> </span><span>"utf8"</span><span>,</span></div></div><div><div><div>51</div></div><div><span>    </span><span>maxBuffer</span><span>:</span><span> </span><span>64</span><span> </span><span>*</span><span> </span><span>1024</span><span> </span><span>*</span><span> </span><span>1024</span><span>,</span></div></div><div><div><div>52</div></div><div><span>});</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>// 容错：git 不可用（浅克隆 / 无 git 环境 / CI 限制）时生成空数据，不中断构建</span></div></div><div><div><div>55</div></div><div><span>if</span><span><span> (</span><span>r</span><span>.</span></span><span>status</span><span> </span><span>!==</span><span> </span><span>0</span><span>) {</span></div></div><div><div><div>56</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>warn</span><span>(</span></div></div><div><div><div>57</div></div><div><span>        </span><span>"[changelog] 警告: git log 执行失败（可能是浅克隆或无 git 环境），生成空数据。"</span><span>,</span></div></div><div><div><div>58</div></div><div><span><span>    </span></span><span>);</span></div></div><div><div><div>59</div></div><div><span>    </span><span>const</span><span> </span><span>empty</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>60</div></div><div><span>        </span><span>generatedAt</span><span>:</span><span> </span><span>new</span><span> </span><span>Date</span><span>().</span><span>toISOString</span><span>(),</span></div></div><div><div><div>61</div></div><div><span>        </span><span>total</span><span>:</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>62</div></div><div><span>        </span><span>groups</span><span>:</span><span> [],</span></div></div><div><div><div>63</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>64</div></div><div><span>    </span><span>mkdirSync</span><span>(</span><span>dirname</span><span>(</span><span>OUTPUT_FILE</span><span>), { </span><span>recursive</span><span>:</span><span> </span><span>true</span><span> });</span></div></div><div><div><div>65</div></div><div><span>    </span><span>writeFileSync</span><span>(</span><span>OUTPUT_FILE</span><span>, </span><span>JSON</span><span>.</span><span>stringify</span><span><span>(</span><span>empty</span><span>, </span></span><span>null</span><span>, </span><span>2</span><span>));</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>`✅ 已生成空数据 </span><span>${</span><span>OUTPUT_FILE</span><span>}</span><span>（total: 0）`</span><span>);</span></div></div><div><div><div>67</div></div><div><span><span>    </span></span><span>process</span><span>.</span><span>exit</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>68</div></div><div><span>}</span></div></div><div><div><div>69</div></div><div><span>const</span><span> </span><span>log</span><span> </span><span>=</span><span><span> </span><span>r</span><span>.</span></span><span>stdout</span><span>;</span></div></div><div><div><div>70</div></div><div>
</div></div><div><div><div>71</div></div><div><span>const</span><span> </span><span>groups</span><span> </span><span>=</span><span> {};</span></div></div><div><div><div>72</div></div><div><span>const</span><span> </span><span>lines</span><span> </span><span>=</span><span><span> </span><span>log</span><span>.</span></span><span>split</span><span>(</span><span>"</span><span>\n</span><span>"</span><span>).</span><span>filter</span><span><span>(</span><span>Boolean</span><span>);</span></span></div></div><div><div><div>73</div></div><div><span>for</span><span> (</span><span>const</span><span> </span><span>line</span><span> </span><span>of</span><span><span> </span><span>lines</span><span>) {</span></span></div></div><div><div><div>74</div></div><div><span>    </span><span>const</span><span> [</span><span>hash</span><span>, </span><span>isoDate</span><span>, </span><span>author</span><span>, </span><span>subject</span><span>] </span><span>=</span><span><span> </span><span>line</span><span>.</span></span><span>split</span><span>(</span><span>"|"</span><span>);</span></div></div><div><div><div>75</div></div><div><span>    </span><span>if</span><span> (</span><span>!</span><span><span>hash</span><span> </span></span><span>||</span><span> </span><span>!</span><span><span>isoDate</span><span>) </span></span><span>continue</span><span>;</span></div></div><div><div><div>76</div></div><div><span>    </span><span>const</span><span> </span><span>date</span><span> </span><span>=</span><span><span> </span><span>isoDate</span><span>.</span></span><span>slice</span><span>(</span><span>0</span><span>, </span><span>10</span><span>);</span></div></div><div><div><div>77</div></div><div><span>    </span><span>const</span><span> </span><span>type</span><span> </span><span>=</span><span> </span><span>detectType</span><span><span>(</span><span>subject</span><span>);</span></span></div></div><div><div><div>78</div></div><div><span><span>    </span></span><span>(</span><span>groups</span><span>[</span><span>date</span><span>] </span><span>??=</span><span> []).</span><span>push</span><span>({</span></div></div><div><div><div>79</div></div><div><span><span>        </span></span><span>hash</span><span>,</span></div></div><div><div><div>80</div></div><div><span><span>        </span></span><span>date</span><span>,</span></div></div><div><div><div>81</div></div><div><span>        </span><span>time</span><span>:</span><span><span> </span><span>isoDate</span><span>.</span></span><span>slice</span><span>(</span><span>11</span><span>, </span><span>19</span><span>),</span></div></div><div><div><div>82</div></div><div><span><span>        </span></span><span>author</span><span>,</span></div></div><div><div><div>83</div></div><div><span><span>        </span></span><span>subject</span><span>,</span></div></div><div><div><div>84</div></div><div><span><span>        </span></span><span>type</span><span>,</span></div></div><div><div><div>85</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>86</div></div><div><span>}</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span>const</span><span> </span><span>data</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>89</div></div><div><span>    </span><span>generatedAt</span><span>:</span><span> </span><span>new</span><span> </span><span>Date</span><span>().</span><span>toISOString</span><span>(),</span></div></div><div><div><div>90</div></div><div><span>    </span><span>total</span><span>:</span><span><span> </span><span>lines</span><span>.</span></span><span>length</span><span>,</span></div></div><div><div><div>91</div></div><div><span>    </span><span>groups</span><span>:</span><span><span> </span><span>Object</span><span>.</span></span><span>entries</span><span><span>(</span><span>groups</span><span>)</span></span></div></div><div><div><div>92</div></div><div><span><span>        </span></span><span>.</span><span>map</span><span><span>(([</span><span>date</span><span>, </span><span>commits</span><span>]) </span></span><span>=&gt;</span><span><span> ({ </span><span>date</span><span>, </span><span>commits</span><span> }))</span></span></div></div><div><div><div>93</div></div><div><span><span>        </span></span><span>.</span><span>sort</span><span><span>((</span><span>a</span><span>, </span><span>b</span><span>) </span></span><span>=&gt;</span><span><span> </span><span>b</span><span>.</span></span><span>date</span><span>.</span><span>localeCompare</span><span><span>(</span><span>a</span><span>.</span></span><span>date</span><span>)),</span></div></div><div><div><div>94</div></div><div><span>};</span></div></div><div><div><div>95</div></div><div>
</div></div><div><div><div>96</div></div><div><span>mkdirSync</span><span>(</span><span>dirname</span><span>(</span><span>OUTPUT_FILE</span><span>), { </span><span>recursive</span><span>:</span><span> </span><span>true</span><span> });</span></div></div><div><div><div>97</div></div><div><span>writeFileSync</span><span>(</span><span>OUTPUT_FILE</span><span>, </span><span>JSON</span><span>.</span><span>stringify</span><span><span>(</span><span>data</span><span>, </span></span><span>null</span><span>, </span><span>2</span><span>));</span></div></div><div><div><div>98</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>`✅ 已生成 </span><span>${</span><span>OUTPUT_FILE</span><span>}</span><span>`</span><span>);</span></div></div><div><div><div>99</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>`   共 </span><span>${</span><span>data</span><span>.</span><span>total</span><span>}</span><span> 次提交，</span><span>${</span><span>data</span><span>.</span><span>groups</span><span>.</span><span>length</span><span>}</span><span> 个日期分组`</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>添加页面<a href="#添加页面"><span>#</span></a></h3><p>在<code>你的博客/src/pages</code>中新建<code>changelog.astro</code>并输入下列内容：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>import</span><span> { </span><span>siteConfig</span><span> } </span><span>from</span><span> </span><span>"@/config/siteConfig"</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>MainGridLayout</span><span> </span><span>from</span><span> </span><span>"@/layouts/MainGridLayout.astro"</span><span>;</span></div></div><div><div><div>4</div></div><div><span>import</span><span> </span><span>changelog</span><span> </span><span>from</span><span> </span><span>"@/constants/changelog.json"</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>// 检查页面是否启用</span></div></div><div><div><div>7</div></div><div><span>if</span><span> (</span><span>!</span><span><span>siteConfig</span><span>.</span></span><span>pages</span><span>.</span><span>changelog</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>  </span><span>return</span><span><span> </span><span>Astro</span><span>.</span></span><span>redirect</span><span>(</span><span>"/404/"</span><span>);</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>interface</span><span> </span><span>Commit</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>hash</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>date</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>time</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>author</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>subject</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>type</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>// 提交类型 → 中文标签 + 语义色（与 scripts/generate-changelog.mjs 一致）</span></div></div><div><div><div>21</div></div><div><span>const</span><span> </span><span>TYPE_META</span><span>:</span><span> </span><span>Record</span><span><span>&lt;</span><span>string</span><span>, { </span><span>label</span></span><span>:</span><span><span> </span><span>string</span><span>; </span><span>color</span></span><span>:</span><span><span> </span><span>string</span><span> }&gt; </span></span><span>=</span><span> {</span></div></div><div><div><div>22</div></div><div><span>  </span><span>feat</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"新功能"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#22c55e"</span><span> },</span></div></div><div><div><div>23</div></div><div><span>  </span><span>fix</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"修复"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#ef4444"</span><span> },</span></div></div><div><div><div>24</div></div><div><span>  </span><span>perf</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"优化"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#3b82f6"</span><span> },</span></div></div><div><div><div>25</div></div><div><span>  </span><span>docs</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"文档"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#8b5cf6"</span><span> },</span></div></div><div><div><div>26</div></div><div><span>  </span><span>refactor</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"重构"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#f59e0b"</span><span> },</span></div></div><div><div><div>27</div></div><div><span>  </span><span>style</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"样式"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#14b8a6"</span><span> },</span></div></div><div><div><div>28</div></div><div><span>  </span><span>test</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"测试"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#a855f7"</span><span> },</span></div></div><div><div><div>29</div></div><div><span>  </span><span>build</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"构建"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#64748b"</span><span> },</span></div></div><div><div><div>30</div></div><div><span>  </span><span>ci</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"CI"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#64748b"</span><span> },</span></div></div><div><div><div>31</div></div><div><span>  </span><span>chore</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"杂项"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#64748b"</span><span> },</span></div></div><div><div><div>32</div></div><div><span>  </span><span>revert</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"回退"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#ef4444"</span><span> },</span></div></div><div><div><div>33</div></div><div><span>  </span><span>merge</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"合并"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#06b6d4"</span><span> },</span></div></div><div><div><div>34</div></div><div><span>  </span><span>update</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"更新"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#0ea5e9"</span><span> },</span></div></div><div><div><div>35</div></div><div><span>  </span><span>improve</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"改进"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#10b981"</span><span> },</span></div></div><div><div><div>36</div></div><div><span>  </span><span>other</span><span>:</span><span> { </span><span>label</span><span>:</span><span> </span><span>"提交"</span><span>, </span><span>color</span><span>:</span><span> </span><span>"#94a3b8"</span><span> },</span></div></div><div><div><div>37</div></div><div><span>};</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>const</span><span> </span><span>groups</span><span> </span><span>=</span><span><span> </span><span>changelog</span><span>.</span></span><span>groups</span><span><span> </span><span>as</span><span> { </span><span>date</span></span><span>:</span><span> </span><span>string</span><span><span>; </span><span>commits</span></span><span>:</span><span> </span><span>Commit</span><span>[] }[];</span></div></div><div><div><div>40</div></div><div><span>const</span><span> </span><span>EXPANDED_COUNT</span><span> </span><span>=</span><span> </span><span>10</span><span>; </span><span>// 默认展开最近 10 组</span></div></div><div><div><div>41</div></div><div><span>const</span><span> </span><span>generatedDate</span><span> </span><span>=</span><span><span> </span><span>changelog</span><span>.</span></span><span>generatedAt</span></div></div><div><div><div>42</div></div><div><span>  </span><span>?</span><span> </span><span>new</span><span> </span><span>Date</span><span><span>(</span><span>changelog</span><span>.</span></span><span>generatedAt</span><span>).</span><span>toLocaleDateString</span><span>(</span><span>"zh-CN"</span><span>)</span></div></div><div><div><div>43</div></div><div><span>  </span><span>:</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>44</div></div><div><span>---</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>&lt;</span><span><span>MainGridLayout</span><span> </span><span>title</span></span><span>=</span><span>"更新日志"</span><span>&gt;</span></div></div><div><div><div>47</div></div><div><span>  </span><span>&lt;</span><span>div</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>class</span><span>=</span><span>"flex w-full rounded-(--radius-large) overflow-hidden relative min-h-32"</span></div></div><div><div><div>49</div></div><div><span>  </span><span>&gt;</span></div></div><div><div><div>50</div></div><div><span>    </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"card-base z-10 px-9 py-6 relative w-full"</span><span>&gt;</span></div></div><div><div><div>51</div></div><div><span>      </span><span>&lt;!--</span><span><span> </span><span>页面标题</span><span> </span></span><span>--&gt;</span></div></div><div><div><div>52</div></div><div><span>      </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"flex flex-col items-start justify-center mb-8"</span><span>&gt;</span></div></div><div><div><div>53</div></div><div><span>        </span><span>&lt;</span><span>h1</span></div></div><div><div><div>54</div></div><div><span><span>          </span></span><span>class</span><span>=</span><span>"text-4xl font-bold text-black/90 dark:text-white/90 mb-2 relative before:w-1 before:h-8 before:rounded-md before:bg-(--primary) before:absolute before:top-1/2 before:-translate-y-1/2 before:-left-4"</span></div></div><div><div><div>55</div></div><div><span>        </span><span>&gt;</span></div></div><div><div><div>56</div></div><div><span><span>          </span></span><span>更新日志</span></div></div><div><div><div>57</div></div><div><span>        </span><span>&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>58</div></div><div><span>        </span><span>&lt;</span><span><span>p</span><span> </span><span>class</span></span><span>=</span><span>"text-sm text-black/60 dark:text-white/60"</span><span>&gt;</span></div></div><div><div><div>59</div></div><div><span><span>          </span></span><span>共</span><span> {</span><span>changelog</span><span>.</span><span>total</span><span><span>} </span><span>次提交</span><span> · {</span><span>groups</span><span>.</span></span><span>length</span><span><span>} </span><span>个日期</span></span></div></div><div><div><div>60</div></div><div><span><span>          </span></span><span>{</span><span>generatedDate</span><span> </span><span>&amp;&amp;</span><span><span> &lt;&gt;· </span><span>数据更新于</span><span> {</span><span>generatedDate</span><span>}</span></span><span>&lt;/&gt;</span><span>}</span></div></div><div><div><div>61</div></div><div><span>        </span><span>&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>62</div></div><div><span>      </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>      </span><span>&lt;!--</span><span><span> </span><span>提交列表</span><span> </span></span><span>--&gt;</span></div></div><div><div><div>65</div></div><div><span>      </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"flex flex-col gap-4"</span><span>&gt;</span></div></div><div><div><div>66</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>67</div></div><div><span><span>          </span></span><span>groups</span><span>.</span><span>map</span><span><span>((</span><span>group</span><span>, </span><span>gi</span><span>) </span></span><span>=&gt;</span><span> (</span></div></div><div><div><div>68</div></div><div><span><span>            </span></span><span>group</span><span>.</span><span>commits</span><span>.</span><span>length</span><span> </span><span>&gt;</span><span> </span><span>0</span><span> </span><span>&amp;&amp;</span><span> (</span></div></div><div><div><div>69</div></div><div><span><span>              </span></span><span>gi</span><span> </span><span>&lt;</span><span> </span><span>EXPANDED_COUNT</span><span> </span><span>?</span><span> (</span></div></div><div><div><div>70</div></div><div><span>                </span><span>// 展开的分组</span></div></div><div><div><div>71</div></div><div><span>                </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"changelog-group"</span><span>&gt;</span></div></div><div><div><div>72</div></div><div><span>                  </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"changelog-date-row"</span><span>&gt;</span></div></div><div><div><div>73</div></div><div><span>                    </span><span>&lt;</span><span><span>span</span><span> </span><span>class</span></span><span>=</span><span>"changelog-date-badge"</span><span>&gt;</span><span><span>{group.</span><span>date</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>74</div></div><div><span>                    </span><span>&lt;</span><span><span>span</span><span> </span><span>class</span></span><span>=</span><span>"changelog-date-count"</span><span>&gt;</span><span><span>{group.commits.</span><span>length</span><span>} </span><span>条提交</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>75</div></div><div><span>                  </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>76</div></div><div><span>                  </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"changelog-list"</span><span>&gt;</span></div></div><div><div><div>77</div></div><div><span><span>                    </span></span><span>{</span></div></div><div><div><div>78</div></div><div><span><span>                      </span></span><span>group.commits.map((c) =&gt; (</span></div></div><div><div><div>79</div></div><div><span><span>                        </span></span><span>&lt;div </span><span>class</span><span>=</span><span>"changelog-item"</span><span>&gt;</span></div></div><div><div><div>80</div></div><div><span><span>                          </span></span><span>&lt;</span><span>span</span></div></div><div><div><div>81</div></div><div><span><span>                            </span></span><span>class</span><span>=</span><span>"changelog-type"</span></div></div><div><div><div>82</div></div><div><span><span>                            </span></span><span>style</span><span>=</span><span>{</span><span>`color: </span><span>${</span><span>TYPE_META</span><span><span>[</span><span>c</span></span><span>.</span><span>type</span><span>]</span><span>?.</span><span>color</span><span> </span><span>??</span><span> </span><span>"</span><span>#94a3b8</span><span><span>"</span><span>}</span></span><span>; background: color-mix(in srgb, </span><span>${</span><span>TYPE_META</span><span><span>[</span><span>c</span></span><span>.</span><span>type</span><span>]</span><span>?.</span><span>color</span><span> </span><span>??</span><span> </span><span>"</span><span>#94a3b8</span><span><span>"</span><span>}</span></span><span> 12%, transparent);`</span><span>}</span></div></div><div><div><div>83</div></div><div><span><span>                          </span></span><span>&gt;</span></div></div><div><div><div>84</div></div><div><span><span>                            </span></span><span>{</span><span>TYPE_META</span><span><span>[</span><span>c</span><span>.</span></span><span>type</span><span>]?.</span><span>label</span><span> </span><span>??</span><span> </span><span>"提交"</span><span>}</span></div></div><div><div><div>85</div></div><div><span><span>                          </span></span><span>&lt;/span&gt;</span></div></div><div><div><div>86</div></div><div><span><span>                          </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-subject"</span><span>&gt;</span><span><span>{c.</span><span>subject</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>87</div></div><div><span><span>                          </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-meta"</span><span>&gt;</span></div></div><div><div><div>88</div></div><div><span><span>                            </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-hash"</span><span>&gt;</span><span><span>{c.</span><span>hash</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>89</div></div><div><span><span>                            </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-time"</span><span>&gt;</span><span><span>{c.</span><span>time</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>90</div></div><div><span><span>                          </span></span><span>&lt;/span&gt;</span></div></div><div><div><div>91</div></div><div><span><span>                        </span></span><span>&lt;/div&gt;</span></div></div><div><div><div>92</div></div><div><span><span>                      </span></span><span>))</span></div></div><div><div><div>93</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>94</div></div><div><span>                  </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>95</div></div><div><span>                </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>96</div></div><div><span><span>              </span></span><span>) </span><span>:</span><span> (</span></div></div><div><div><div>97</div></div><div><span>                </span><span>// 折叠的旧分组</span></div></div><div><div><div>98</div></div><div><span>                </span><span>&lt;</span><span><span>details</span><span> </span><span>class</span></span><span>=</span><span>"changelog-collapse"</span><span>&gt;</span></div></div><div><div><div>99</div></div><div><span>                  </span><span>&lt;</span><span><span>summary</span><span> </span><span>class</span></span><span>=</span><span>"changelog-collapse-summary"</span><span>&gt;</span></div></div><div><div><div>100</div></div><div><span>                    </span><span>&lt;</span><span><span>span</span><span> </span><span>class</span></span><span>=</span><span>"inline-flex items-center gap-2 text-sm text-(--content-meta) cursor-pointer select-none"</span><span>&gt;</span></div></div><div><div><div>101</div></div><div><span>                      </span><span>&lt;</span><span><span>span</span><span> </span><span>class</span></span><span>=</span><span>"changelog-collapse-icon"</span><span>&gt;</span><span>▸</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>102</div></div><div><span>                      </span><span>&lt;</span><span><span>span</span><span> </span><span>class</span></span><span>=</span><span>"font-medium"</span><span>&gt;</span><span><span>{group.</span><span>date</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>103</div></div><div><span>                      </span><span>&lt;</span><span><span>span</span><span> </span><span>class</span></span><span>=</span><span>"text-xs opacity-70"</span><span>&gt;</span><span><span>（{group.commits.</span><span>length</span><span>} </span><span>条提交</span><span>）</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>104</div></div><div><span>                    </span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>105</div></div><div><span>                  </span><span>&lt;/</span><span>summary</span><span>&gt;</span></div></div><div><div><div>106</div></div><div><span>                  </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"changelog-collapse-body"</span><span>&gt;</span></div></div><div><div><div>107</div></div><div><span>                    </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"changelog-group mt-2"</span><span>&gt;</span></div></div><div><div><div>108</div></div><div><span>                      </span><span>&lt;</span><span><span>div</span><span> </span><span>class</span></span><span>=</span><span>"changelog-list"</span><span>&gt;</span></div></div><div><div><div>109</div></div><div><span><span>                        </span></span><span>{</span></div></div><div><div><div>110</div></div><div><span><span>                          </span></span><span>group.commits.map((c) =&gt; (</span></div></div><div><div><div>111</div></div><div><span><span>                            </span></span><span>&lt;div </span><span>class</span><span>=</span><span>"changelog-item"</span><span>&gt;</span></div></div><div><div><div>112</div></div><div><span><span>                              </span></span><span>&lt;</span><span>span</span></div></div><div><div><div>113</div></div><div><span><span>                                </span></span><span>class</span><span>=</span><span>"changelog-type"</span></div></div><div><div><div>114</div></div><div><span><span>                                </span></span><span>style</span><span>=</span><span>{</span><span>`color: </span><span>${</span><span>TYPE_META</span><span><span>[</span><span>c</span></span><span>.</span><span>type</span><span>]</span><span>?.</span><span>color</span><span> </span><span>??</span><span> </span><span>"</span><span>#94a3b8</span><span><span>"</span><span>}</span></span><span>; background: color-mix(in srgb, </span><span>${</span><span>TYPE_META</span><span><span>[</span><span>c</span></span><span>.</span><span>type</span><span>]</span><span>?.</span><span>color</span><span> </span><span>??</span><span> </span><span>"</span><span>#94a3b8</span><span><span>"</span><span>}</span></span><span> 12%, transparent);`</span><span>}</span></div></div><div><div><div>115</div></div><div><span><span>                              </span></span><span>&gt;</span></div></div><div><div><div>116</div></div><div><span><span>                                </span></span><span>{</span><span>TYPE_META</span><span><span>[</span><span>c</span><span>.</span></span><span>type</span><span>]?.</span><span>label</span><span> </span><span>??</span><span> </span><span>"提交"</span><span>}</span></div></div><div><div><div>117</div></div><div><span><span>                              </span></span><span>&lt;/span&gt;</span></div></div><div><div><div>118</div></div><div><span><span>                              </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-subject"</span><span>&gt;</span><span><span>{c.</span><span>subject</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>119</div></div><div><span><span>                              </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-meta"</span><span>&gt;</span></div></div><div><div><div>120</div></div><div><span><span>                                </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-hash"</span><span>&gt;</span><span><span>{c.</span><span>hash</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>121</div></div><div><span><span>                                </span></span><span>&lt;span </span><span>class</span><span>=</span><span>"changelog-time"</span><span>&gt;</span><span><span>{c.</span><span>time</span><span>}</span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>122</div></div><div><span><span>                              </span></span><span>&lt;/span&gt;</span></div></div><div><div><div>123</div></div><div><span><span>                            </span></span><span>&lt;/div&gt;</span></div></div><div><div><div>124</div></div><div><span><span>                          </span></span><span>))</span></div></div><div><div><div>125</div></div><div><span><span>                        </span></span><span>}</span></div></div><div><div><div>126</div></div><div><span>                      </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>127</div></div><div><span>                    </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>128</div></div><div><span>                  </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>129</div></div><div><span>                </span><span>&lt;/</span><span>details</span><span>&gt;</span></div></div><div><div><div>130</div></div><div><span><span>              </span></span><span>)</span></div></div><div><div><div>131</div></div><div><span><span>            </span></span><span>)</span></div></div><div><div><div>132</div></div><div><span><span>          </span></span><span>))</span></div></div><div><div><div>133</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>134</div></div><div><span>      </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>135</div></div><div>
</div></div><div><div><div>136</div></div><div><span>      </span><span>&lt;!--</span><span><span> </span><span>页脚说明</span><span> </span></span><span>--&gt;</span></div></div><div><div><div>137</div></div><div><span>      </span><span>&lt;</span><span><span>p</span><span> </span><span>class</span></span><span>=</span><span>"text-xs text-(--content-meta) mt-8 pt-4 border-t border-(--line-divider)"</span><span>&gt;</span></div></div><div><div><div>138</div></div><div><span><span>        </span></span><span>数据由</span><span> </span><span>&lt;</span><span><span>code</span><span> </span><span>class</span></span><span>=</span><span>"text-(--primary)"</span><span>&gt;</span><span>scripts</span><span>/</span><span>generate</span><span>-</span><span><span>changelog</span><span>.</span></span><span>mjs</span><span>&lt;/</span><span>code</span><span>&gt;</span><span><span> </span><span>在构建时从</span><span> </span><span>git</span><span> </span><span>提交历史自动生成</span><span>。</span></span></div></div><div><div><div>139</div></div><div><span>      </span><span>&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>140</div></div><div><span>    </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>141</div></div><div><span>  </span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>142</div></div><div><span>&lt;/</span><span>MainGridLayout</span><span>&gt;</span></div></div><div><div><div>143</div></div><div>
</div></div><div><div><div>144</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>145</div></div><div><span>  </span><span>/* 日期分组 */</span></div></div><div><div><div>146</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>group</span><span> {</span></span></div></div><div><div><div>147</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>flex</span><span>;</span></div></div><div><div><div>148</div></div><div><span><span>    </span></span><span>flex</span><span>-</span><span><span>direction</span><span>: </span><span>column</span><span>;</span></span></div></div><div><div><div>149</div></div><div><span><span>    </span></span><span>gap</span><span>: 0.5</span><span>rem</span><span>;</span></div></div><div><div><div>150</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>151</div></div><div>
</div></div><div><div><div>152</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>date</span><span>-</span><span><span>row</span><span> {</span></span></div></div><div><div><div>153</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>flex</span><span>;</span></div></div><div><div><div>154</div></div><div><span><span>    </span></span><span>align</span><span>-</span><span><span>items</span><span>: </span><span>center</span><span>;</span></span></div></div><div><div><div>155</div></div><div><span><span>    </span></span><span>gap</span><span>: 0.75</span><span>rem</span><span>;</span></div></div><div><div><div>156</div></div><div><span><span>    </span></span><span>margin</span><span>-</span><span><span>bottom</span><span>: 0.25</span><span>rem</span><span>;</span></span></div></div><div><div><div>157</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>158</div></div><div>
</div></div><div><div><div>159</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>date</span><span>-</span><span><span>badge</span><span> {</span></span></div></div><div><div><div>160</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>inline</span><span>-</span><span><span>flex</span><span>;</span></span></div></div><div><div><div>161</div></div><div><span><span>    </span></span><span>align</span><span>-</span><span><span>items</span><span>: </span><span>center</span><span>;</span></span></div></div><div><div><div>162</div></div><div><span><span>    </span></span><span>padding</span><span>: 0.2</span><span>rem</span><span> 0.75</span><span>rem</span><span>;</span></div></div><div><div><div>163</div></div><div><span><span>    </span></span><span>border</span><span>-</span><span><span>radius</span><span>: 9999</span><span>px</span><span>;</span></span></div></div><div><div><div>164</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>size</span><span>: 0.8</span><span>rem</span><span>;</span></span></div></div><div><div><div>165</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>weight</span><span>: </span></span><span>600</span><span>;</span></div></div><div><div><div>166</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span>variant</span><span>-</span><span><span>numeric</span><span>: </span><span>tabular</span></span><span>-</span><span><span>nums</span><span>;</span></span></div></div><div><div><div>167</div></div><div><span><span>    </span></span><span>color</span><span>: </span><span>var</span><span><span>(--</span><span>primary</span><span>);</span></span></div></div><div><div><div>168</div></div><div><span><span>    </span></span><span>background</span><span>: </span><span>color</span><span>-</span><span>mix</span><span>(</span><span>in</span><span><span> </span><span>oklch</span><span>, </span></span><span>var</span><span>(</span><span>--</span><span><span>primary</span><span>) </span></span><span>12</span><span>%</span><span><span>, </span><span>transparent</span><span>);</span></span></div></div><div><div><div>169</div></div><div><span><span>    </span></span><span>border</span><span>: 1</span><span>px</span><span> </span><span>solid</span><span> </span><span>color</span><span>-</span><span>mix</span><span>(</span><span>in</span><span><span> </span><span>oklch</span><span>, </span></span><span>var</span><span>(</span><span>--</span><span><span>primary</span><span>) </span></span><span>25</span><span>%</span><span><span>, </span><span>transparent</span><span>);</span></span></div></div><div><div><div>170</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>171</div></div><div>
</div></div><div><div><div>172</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>date</span><span>-</span><span><span>count</span><span> {</span></span></div></div><div><div><div>173</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>size</span><span>: 0.75</span><span>rem</span><span>;</span></span></div></div><div><div><div>174</div></div><div><span><span>    </span></span><span>color</span><span>: </span><span>var</span><span><span>(--</span><span>content</span><span>-meta);</span></span></div></div><div><div><div>175</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>176</div></div><div>
</div></div><div><div><div>177</div></div><div><span>  </span><span>/* 提交列表 */</span></div></div><div><div><div>178</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>list</span><span> {</span></span></div></div><div><div><div>179</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>flex</span><span>;</span></div></div><div><div><div>180</div></div><div><span><span>    </span></span><span>flex</span><span>-</span><span><span>direction</span><span>: </span><span>column</span><span>;</span></span></div></div><div><div><div>181</div></div><div><span><span>    </span></span><span>border</span><span>: 1</span><span>px</span><span> </span><span>solid</span><span> </span><span>var</span><span><span>(--</span><span>line</span><span>-divider);</span></span></div></div><div><div><div>182</div></div><div><span><span>    </span></span><span>border</span><span>-</span><span><span>radius</span><span>: 0.75</span><span>rem</span><span>;</span></span></div></div><div><div><div>183</div></div><div><span><span>    </span></span><span>overflow</span><span>: </span><span>hidden</span><span>;</span></div></div><div><div><div>184</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>185</div></div><div>
</div></div><div><div><div>186</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>item</span><span> {</span></span></div></div><div><div><div>187</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>flex</span><span>;</span></div></div><div><div><div>188</div></div><div><span><span>    </span></span><span>align</span><span>-</span><span><span>items</span><span>: </span><span>center</span><span>;</span></span></div></div><div><div><div>189</div></div><div><span><span>    </span></span><span>gap</span><span>: 0.75</span><span>rem</span><span>;</span></div></div><div><div><div>190</div></div><div><span><span>    </span></span><span>padding</span><span>: 0.55</span><span>rem</span><span> 0.9</span><span>rem</span><span>;</span></div></div><div><div><div>191</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>size</span><span>: 0.85</span><span>rem</span><span>;</span></span></div></div><div><div><div>192</div></div><div><span><span>    </span></span><span>transition</span><span>: </span><span>background</span><span> 0.2</span><span>s</span><span> </span><span>ease</span><span>;</span></div></div><div><div><div>193</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>194</div></div><div>
</div></div><div><div><div>195</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>item</span><span>:</span></span><span>not</span><span><span>(:</span><span>last</span></span><span>-</span><span><span>child</span><span>) {</span></span></div></div><div><div><div>196</div></div><div><span><span>    </span></span><span>border</span><span>-</span><span><span>bottom</span><span>: 1</span><span>px</span><span> </span><span>dashed</span><span> </span></span><span>var</span><span><span>(--</span><span>line</span><span>-divider);</span></span></div></div><div><div><div>197</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>198</div></div><div>
</div></div><div><div><div>199</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>item</span><span>:</span><span>hover</span><span> {</span></span></div></div><div><div><div>200</div></div><div><span><span>    </span></span><span>background</span><span>: </span><span>var</span><span><span>(--</span><span>btn</span><span>-plain-bg-hover);</span></span></div></div><div><div><div>201</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>202</div></div><div>
</div></div><div><div><div>203</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>type</span><span> {</span></span></div></div><div><div><div>204</div></div><div><span><span>    </span></span><span>flex</span><span>-</span><span><span>shrink</span><span>: </span></span><span>0</span><span>;</span></div></div><div><div><div>205</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>inline</span><span>-</span><span><span>flex</span><span>;</span></span></div></div><div><div><div>206</div></div><div><span><span>    </span></span><span>align</span><span>-</span><span><span>items</span><span>: </span><span>center</span><span>;</span></span></div></div><div><div><div>207</div></div><div><span><span>    </span></span><span>padding</span><span>: 0.1</span><span>rem</span><span> 0.5</span><span>rem</span><span>;</span></div></div><div><div><div>208</div></div><div><span><span>    </span></span><span>border</span><span>-</span><span><span>radius</span><span>: 0.4</span><span>rem</span><span>;</span></span></div></div><div><div><div>209</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>size</span><span>: 0.7</span><span>rem</span><span>;</span></span></div></div><div><div><div>210</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>weight</span><span>: </span></span><span>600</span><span>;</span></div></div><div><div><div>211</div></div><div><span><span>    </span></span><span>white</span><span>-</span><span><span>space</span><span>: </span><span>nowrap</span><span>;</span></span></div></div><div><div><div>212</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>213</div></div><div>
</div></div><div><div><div>214</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>subject</span><span> {</span></span></div></div><div><div><div>215</div></div><div><span><span>    </span></span><span>flex</span><span>: </span><span>1</span><span>;</span></div></div><div><div><div>216</div></div><div><span><span>    </span></span><span>min</span><span>-</span><span><span>width</span><span>: </span></span><span>0</span><span>;</span></div></div><div><div><div>217</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>weight</span><span>: </span></span><span>500</span><span>;</span></div></div><div><div><div>218</div></div><div><span><span>    </span></span><span>color</span><span>: </span><span>var</span><span><span>(--</span><span>deep</span><span>-text);</span></span></div></div><div><div><div>219</div></div><div><span><span>    </span></span><span>overflow</span><span>: </span><span>hidden</span><span>;</span></div></div><div><div><div>220</div></div><div><span><span>    </span></span><span>text</span><span>-</span><span><span>overflow</span><span>: </span><span>ellipsis</span><span>;</span></span></div></div><div><div><div>221</div></div><div><span><span>    </span></span><span>white</span><span>-</span><span><span>space</span><span>: </span><span>nowrap</span><span>;</span></span></div></div><div><div><div>222</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>223</div></div><div>
</div></div><div><div><div>224</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>meta</span><span> {</span></span></div></div><div><div><div>225</div></div><div><span><span>    </span></span><span>flex</span><span>-</span><span><span>shrink</span><span>: </span></span><span>0</span><span>;</span></div></div><div><div><div>226</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>inline</span><span>-</span><span><span>flex</span><span>;</span></span></div></div><div><div><div>227</div></div><div><span><span>    </span></span><span>align</span><span>-</span><span><span>items</span><span>: </span><span>center</span><span>;</span></span></div></div><div><div><div>228</div></div><div><span><span>    </span></span><span>gap</span><span>: 0.5</span><span>rem</span><span>;</span></div></div><div><div><div>229</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>size</span><span>: 0.7</span><span>rem</span><span>;</span></span></div></div><div><div><div>230</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span>variant</span><span>-</span><span><span>numeric</span><span>: </span><span>tabular</span></span><span>-</span><span><span>nums</span><span>;</span></span></div></div><div><div><div>231</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>232</div></div><div>
</div></div><div><div><div>233</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>hash</span><span> {</span></span></div></div><div><div><div>234</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>family</span><span>: </span><span>ui</span></span><span>-</span><span><span>monospace</span><span>, </span></span><span>"Cascadia Mono"</span><span>, </span><span>"Segoe UI Mono"</span><span><span>, </span><span>monospace</span><span>;</span></span></div></div><div><div><div>235</div></div><div><span><span>    </span></span><span>color</span><span>: </span><span>var</span><span><span>(--</span><span>primary</span><span>);</span></span></div></div><div><div><div>236</div></div><div><span><span>    </span></span><span>opacity</span><span>: </span><span>0.75</span><span>;</span></div></div><div><div><div>237</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>238</div></div><div>
</div></div><div><div><div>239</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>time</span><span> {</span></span></div></div><div><div><div>240</div></div><div><span><span>    </span></span><span>color</span><span>: </span><span>var</span><span><span>(--</span><span>content</span><span>-meta);</span></span></div></div><div><div><div>241</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>242</div></div><div>
</div></div><div><div><div>243</div></div><div><span>  </span><span>/* 折叠分组 */</span></div></div><div><div><div>244</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>collapse</span><span> {</span></span></div></div><div><div><div>245</div></div><div><span><span>    </span></span><span>border</span><span>: 1</span><span>px</span><span> </span><span>solid</span><span> </span><span>var</span><span><span>(--</span><span>line</span><span>-divider);</span></span></div></div><div><div><div>246</div></div><div><span><span>    </span></span><span>border</span><span>-</span><span><span>radius</span><span>: 0.75</span><span>rem</span><span>;</span></span></div></div><div><div><div>247</div></div><div><span><span>    </span></span><span>overflow</span><span>: </span><span>hidden</span><span>;</span></div></div><div><div><div>248</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>249</div></div><div>
</div></div><div><div><div>250</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>collapse</span><span>-</span><span><span>summary</span><span> {</span></span></div></div><div><div><div>251</div></div><div><span><span>    </span></span><span>list</span><span>-</span><span><span>style</span><span>: </span><span>none</span><span>;</span></span></div></div><div><div><div>252</div></div><div><span><span>    </span></span><span>padding</span><span>: 0.6</span><span>rem</span><span> 0.9</span><span>rem</span><span>;</span></div></div><div><div><div>253</div></div><div><span><span>    </span></span><span>cursor</span><span>: </span><span>pointer</span><span>;</span></div></div><div><div><div>254</div></div><div><span><span>    </span></span><span>transition</span><span>: </span><span>background</span><span> 0.2</span><span>s</span><span> </span><span>ease</span><span>;</span></div></div><div><div><div>255</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>256</div></div><div>
</div></div><div><div><div>257</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>collapse</span><span>-</span><span><span>summary</span><span>:</span><span>hover</span><span> {</span></span></div></div><div><div><div>258</div></div><div><span><span>    </span></span><span>background</span><span>: </span><span>var</span><span><span>(--</span><span>btn</span><span>-plain-bg-hover);</span></span></div></div><div><div><div>259</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>260</div></div><div>
</div></div><div><div><div>261</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>collapse</span><span>-</span><span><span>summary</span><span>::</span></span><span>-</span><span>webkit</span><span>-</span><span>details</span><span>-</span><span><span>marker</span><span> {</span></span></div></div><div><div><div>262</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>none</span><span>;</span></div></div><div><div><div>263</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>264</div></div><div>
</div></div><div><div><div>265</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span><span>collapse</span><span>[</span><span>open</span><span>] .</span></span><span>changelog</span><span>-</span><span>collapse</span><span>-</span><span><span>icon</span><span> {</span></span></div></div><div><div><div>266</div></div><div><span><span>    </span></span><span>transform</span><span>: </span><span>rotate</span><span><span>(90</span><span>deg</span><span>);</span></span></div></div><div><div><div>267</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>268</div></div><div>
</div></div><div><div><div>269</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>collapse</span><span>-</span><span><span>icon</span><span> {</span></span></div></div><div><div><div>270</div></div><div><span><span>    </span></span><span>display</span><span>: </span><span>inline</span><span>-</span><span><span>block</span><span>;</span></span></div></div><div><div><div>271</div></div><div><span><span>    </span></span><span>transition</span><span>: </span><span>transform</span><span> 0.2</span><span>s</span><span> </span><span>ease</span><span>;</span></div></div><div><div><div>272</div></div><div><span><span>    </span></span><span>font</span><span>-</span><span><span>size</span><span>: 0.7</span><span>rem</span><span>;</span></span></div></div><div><div><div>273</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>274</div></div><div>
</div></div><div><div><div>275</div></div><div><span><span>  </span></span><span>.</span><span>changelog</span><span>-</span><span>collapse</span><span>-</span><span><span>body</span><span> {</span></span></div></div><div><div><div>276</div></div><div><span><span>    </span></span><span>padding</span><span>: </span><span>0</span><span><span> 0.75</span><span>rem</span><span> 0.75</span><span>rem</span><span>;</span></span></div></div><div><div><div>277</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>278</div></div><div>
</div></div><div><div><div>279</div></div><div><span>  </span><span>/* 暗色适配 */</span></div></div><div><div><div>280</div></div><div><span><span>  </span></span><span>:</span><span>global</span><span>(.</span><span>dark</span><span>) .</span><span>changelog</span><span>-</span><span><span>subject</span><span> {</span></span></div></div><div><div><div>281</div></div><div><span><span>    </span></span><span>color</span><span>: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.88</span><span>);</span></div></div><div><div><div>282</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>283</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>注册页面<a href="#注册页面"><span>#</span></a></h3><p>打开 <code>src/config/siteConfig.ts</code>，在 <code>pages</code> 页面开关配置（<code>resolvePageToggles({ ... })</code> 内）添加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>// 更新日志页面开关（自定义页面）</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>changelog</span><span>: </span><span>true</span><span>,</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>打开 <code>src/types/siteConfig.ts</code>，在 <code>pages</code> 类型定义<code>pages: { ... };</code>中添加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>changelog</span><span>?:</span><span><span> </span><span>boolean</span><span>; </span></span><span>// 更新日志页面开关（用户自定义）</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>添加导航栏入口<a href="#添加导航栏入口"><span>#</span></a></h3><p>打开 <code>src/config/navBarConfig.ts</code>：</p><p><strong>①</strong> 在 <code>LinkPresets</code> 对象末尾（<code>About</code> 之后）添加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>// 更新日志（自定义页面）</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>Changelog</span><span>: {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>name</span><span>: </span><span>"更新日志"</span><span>,</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>url</span><span>: </span><span>"/changelog/"</span><span>,</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>icon</span><span>: </span><span>"material-symbols:history"</span><span>,</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>pageKey</span><span>: </span><span>"changelog"</span><span>,</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>②</strong> 在「关于」菜单的 <code>children</code> 数组中添加（顶部）：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>children</span><span>: [</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// 更新日志</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>LinkPresets</span><span>.</span><span>Changelog</span><span>,</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>// 打赏</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>LinkPresets</span><span>.</span><span>Sponsor</span><span>,</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>// 关于页面</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>LinkPresets</span><span>.</span><span>About</span><span>,</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>],</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>接入构建流程（可选但推荐）<a href="#接入构建流程可选但推荐"><span>#</span></a></h3><p>打开 <code>package.json</code>，在 <code>build</code> 最前面加上生成步骤：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"build"</span><span>: </span><span>"node scripts/generate-changelog.mjs &amp;&amp; npx tsx scripts/generate-github-card-data.ts &amp;&amp; ..."</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>首次生成数据<a href="#首次生成数据"><span>#</span></a></h3><p>博客根目录执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>node</span><span> </span><span>scripts/generate-changelog.mjs</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>会在 <code>src/constants/changelog.json</code> 生成数据（显示「共 N 次提交 · M 个日期」）。</p></section></section>
<section><h1>使用说明<a href="#使用说明"><span>#</span></a></h1><p><strong>提交规范</strong>：</p><p>提交消息以类型前缀开头即可自动分类</p><p>示例：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"feat: 新增音乐可视化"</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"fix: 修复天气按钮重叠"</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"perf: 压缩文章图片"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>

<table><thead><tr><th>提交前缀</th><th>页面显示</th><th>颜色</th><th>适用场景</th></tr></thead><tbody><tr><td><code>feat:</code></td><td>新功能</td><td>绿</td><td>新页面、新组件、新能力</td></tr><tr><td><code>fix:</code></td><td>修复</td><td>红</td><td>修 bug、修样式问题</td></tr><tr><td><code>perf:</code></td><td>优化</td><td>蓝</td><td>性能、加载速度</td></tr><tr><td><code>improve:</code></td><td>改进</td><td>青</td><td>体验改进（非性能）</td></tr><tr><td><code>refactor:</code></td><td>重构</td><td>橙</td><td>重写代码，行为不变</td></tr><tr><td><code>style:</code></td><td>样式</td><td>青蓝</td><td>纯 CSS/视觉调整</td></tr><tr><td><code>docs:</code></td><td>文档</td><td>紫</td><td>README、注释、文档</td></tr><tr><td><code>chore:</code></td><td>杂项</td><td>灰</td><td>依赖、配置、杂物</td></tr><tr><td><code>build:</code></td><td>构建</td><td>灰</td><td>构建脚本/流程</td></tr><tr><td><code>merge:</code></td><td>合并</td><td>浅青</td><td>分支合并</td></tr><tr><td><code>revert:</code></td><td>回退</td><td>红</td><td>撤销提交</td></tr><tr><td>其他</td><td>提交</td><td>灰</td><td>未匹配的默认分类</td></tr><tr><td>每次提交都需执行<code>node scripts/generate-changelog.mjs</code>更新日志数据</td><td></td><td></td><td></td></tr></tbody></table><p>若接入构建流程可由平台部署时自动生成</p><p><strong>完整工作流：</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 提交你的改动</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>.</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"feat: xxx"</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 2. 刷新更新日志数据（或直接 pnpm build 自动刷新）</span></div></div><div><div><div>6</div></div><div><span>node</span><span> </span><span>scripts/generate-changelog.mjs</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 3. 提交更新后的数据</span></div></div><div><div><div>9</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>src/constants/changelog.json</span></div></div><div><div><div>10</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"chore: 更新更新日志"</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>git</span><span> </span><span>push</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h1>注意事项<a href="#注意事项"><span>#</span></a></h1><ol>
<li>
<p><strong>脚本读的是当前 git 仓库历史</strong>——如果仓库带有上游历史（比如从模板复制），日志会显示上游的提交；想只显示自己的提交，请先重置历史：删除 <code>.git</code> 后 <code>git init</code> + 首次提交。</p>
</li>
<li>
<p><strong>Cloudflare Pages / Workers 部署</strong>：CF 默认浅克隆（<code>depth=1</code>），脚本开头会自动 <code>git fetch --unshallow</code> 拉深历史——只要部署平台执行 <code>pnpm build</code>（build 脚本含 generate-changelog），就能在构建时生成<strong>最新</strong>提交数据，无需本地手动跑。git 环境不可用时会生成空数据（页面显示 0 条），不会导致构建失败。</p>
</li>
<li>
<p>页面默认展开最近 10 组，如需调整改 <code>changelog.astro</code> 顶部的 <code>EXPANDED_COUNT</code> 常量。</p>
</li>
<li>
<p>如需修改分类文案/颜色，同时改脚本 <code>TYPE_LABELS</code> 和页面 <code>TYPE_META</code>（两处保持一致）。</p>
</li>
</ol></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/cf/cf/</id>
      <title type="text">Cloudflare国内速度优化、优选域名IP心得分享</title>
      <published>2026-08-26T00:00:00.000Z</published>
      <updated>2026-08-26T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/cf/cf/"/>
      <summary type="text">为你的CloudflareWorkers&amp;Pages等项目提升国内访问速度</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>最近发现自己的网站部署在Cloudflare Workers上，不开代理访问速度很慢，去ITDOG测试了才发现原来我的网站在国内访问速度惨不忍睹，加载时间最长甚至需要20s。</p><p>于是我开始寻找解决方案，经过一段时间的寻找，最终也是发现了IP优选这条方法。</p><p>Cloudflare的CDN在全球有不少的边缘节点，访问距离自己距离近的节点能够显著提升访问速度。但是CF通常分配的IP段都距离国内很远，于是访问延迟一下子上去了。这时就需要优选域名/IP了。</p><p>优选域名/IP的原理是跳过CF的CDN调度，直接指定一个优质CF边缘IP。而优选域名的本质就是别人帮你24小时测速选择一批优质IP。</p><p><strong>对于Wokers&amp;Pages项目有效，R2存储库、SaaS项目也可以加速但本文不过多阐述</strong></p><p></p><figure><img alt="无优选" loading="lazy" width="608" height="548" src="/_astro/Pasted%20image%2020260826154319.B7BrPdfa_ZyLwBM.webp" /><figcaption>无优选</figcaption></figure><p></p><p></p><figure><img alt="优选域名" loading="lazy" width="603" height="539" src="/_astro/Pasted%20image%2020260826155741.BXq6AOZS_ZWjRbt.webp" /><figcaption>优选域名</figcaption></figure><p></p><p></p><figure><img alt="优选IP" loading="lazy" width="602" height="546" src="/_astro/Pasted%20image%2020260826160900.C8jQtYcn_1nO3LV.webp" /><figcaption>优选IP</figcaption></figure><p></p></section>
<section><h1>加速步骤<a href="#加速步骤"><span>#</span></a></h1><section><h3>优选域名（推荐）<a href="#优选域名推荐"><span>#</span></a></h3><p>优选域名是使用别人维护的CNAME解析，自动帮助解析优质IP</p><p>下面是一些长期较稳定的优选域名：</p><ul>
<li><a href="https://cf.090227.xyz/" target="_blank">https://cf.090227.xyz/</a></li>
<li><a href="https://www.byoip.top/" target="_blank">https://www.byoip.top/</a></li>
<li><a href="https://cf.877774.xyz/" target="_blank">https://cf.877774.xyz/</a></li>
</ul><p>前往你的Workers&amp;Pages项目-域，点击添加路由，并选择你的域名，并修改编辑框内容
<img alt="" loading="lazy" width="530" height="258" src="/_astro/Pasted%20image%2020260826155211.oa4hT1wz_dTBoN.webp" /></p><p>接着前往你域名的DNS解析处，新建解析，类型<strong>CNAME</strong>，名称填你刚才路由里填写的域名，目标填写你的优选域名，接着<strong>关闭小黄云</strong>，点击保存</p><p><img alt="" loading="lazy" width="774" height="434" src="/_astro/Pasted%20image%2020260826155351.DUY6bbWj_1WU4uz.webp" /></p><p>至此优选域名加速已经生效了。</p></section><section><h3>优选IP<a href="#优选ip"><span>#</span></a></h3><p>优选IP则是需要我们手动查看哪个IP优质了</p><p>这里我们使用一个GitHub上的工具<a href="https://github.com/XIU2/CloudflareSpeedTest" target="_blank">自选优选 IP</a>
。下载对应的客户端并打开，工具会自动测试哪个IP段国内速度更优，等待一会后会出现一个列表，选择延迟最低的即可。</p><p>参考上方优选域名的操作，将CNAME改成A，接着填入测出来的IP即可。</p><p>此方案缺点：需要定时手动测速。</p></section></section>
<section><h1>小结<a href="#小结"><span>#</span></a></h1><p>加速后的访问速度明显比加速前快多了，希望这篇文章能帮到你。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/moepal/moepal/</id>
      <title type="text">MoePal-一款多平台的综合网盘管理、加速下载工具</title>
      <published>2026-08-13T00:00:00.000Z</published>
      <updated>2026-08-13T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/moepal/moepal/"/>
      <summary type="text">MoePal是一款支持Windows、Android、Macos的网盘管理工具，支持夸克、123、天翼、蓝奏、百度、阿里等云盘</summary>
      <content type="html"><![CDATA[<section><h1>简介<a href="#简介"><span>#</span></a></h1><p>MoePal<a href="https://mn.mdown.asia/moepal/" target="_blank">官网</a></p><p>我们都有不少的数据存储在各大网盘上，有时候想寻找、管理网盘数据的时候发现太过麻烦，还得下载打开登录各大网盘的客户端，麻烦且不说还非常臃肿。</p><p>MoePal是一种非常好的解决方案，它支持登录管理10+网盘的数据，仅需一个客户端就可以将自己的云盘握在手中。</p><p>MoePal还有一个非常实用的功能：<strong>下载加速</strong>。例如夸克云盘即使开了会员它最高下载速度为50MB，而moepal能给你干到70MB。</p><p>不过只有部分网盘（夸克、123网盘,光鸭，蓝奏云）目前支持免费使用，如果想要解锁全部云盘需要购买卡密。目前卡密价格适中（我能接受🤔），年卡58，月卡13，周卡6。</p><blockquote><p>[TIP] 提醒
此工具主要功能为更方便的管理网盘、下载文件，无法绕过部分网盘的下载流量限制。</p></blockquote></section>
<section><h1>安装使用<a href="#安装使用"><span>#</span></a></h1><p>安卓端下载APK安装登录即可使用</p><p>Macos按照正常流程拖入应用程序打开登录即可使用</p><p>这里以Windows端安装和登录为示例</p><p>下载并安装.exe安装包</p><p><img alt="" loading="lazy" width="598" height="464" src="/_astro/Pasted%20image%2020260813225037.BDHIckKB_PbdR0.webp" /></p><p><img alt="" loading="lazy" width="598" height="464" src="/_astro/Pasted%20image%2020260813225043.BXT2J-yF_Z1LU0Fe.webp" />
<img alt="" loading="lazy" width="598" height="464" src="/_astro/Pasted%20image%2020260813225050.CcrSufOI_czYoe.webp" /></p><p>这里就安装完成了，点击完成即可打开软件使用↓</p><p><img alt="" loading="lazy" width="598" height="464" src="/_astro/Pasted%20image%2020260813225109.qQhe4jtu_Z2clCSp.webp" /></p></section>
<section><h1>使用<a href="#使用"><span>#</span></a></h1><p>这里以Windows端使用为示例，其余设备使用逻辑相同</p><p>点击左下角登录
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813225259.DJwyJcj7_Z15jPzl.webp" />
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813225315.DkkqGy0J_Z1x9dS4.webp" />
输入你的账户密码登录（没有账户密码的可以选择注册）
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813225400.BG8uuirj_1a4HBD.webp" />
然后就是基本使用方法了
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813230346.Bjkpx_lz_27J2V0.webp" />
<img alt="" loading="lazy" width="1266" height="795" src="/_astro/Pasted%20image%2020260813230451.CsJtO9S4_ZIJl72.webp" />
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813230506.6N5KPVCU_Z1GlqMb.webp" /></p><p>下载速度展示（夸克云盘）</p><p><img alt="" loading="lazy" width="1264" height="791" src="/_astro/3ca98f04-0ae5-4975-8293-3bbc8bc17c6b.BiMTxc5z_Z12SXBo.webp" /></p><p>提升下载速度方法：</p><p><img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813230556.DyO-rMtu_Z1A2dCl.webp" />
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813230603.D3u97vEx_Z1aI2I5.webp" /></p><p>设置线路为快传，线程设置的大一些
<img alt="" loading="lazy" width="1264" height="791" src="/_astro/Pasted%20image%2020260813230629.B9yx9w0M_ZKfjBV.webp" /></p><p>其他网盘想要下载速度快一些的话就把线程设置大一些，这样可以加速下载。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/e-mail/e-mail/</id>
      <title type="text">利用自己的域名+Cloudflare+Resend搭建属于自己的域名邮箱，实现零成本收发邮件功能</title>
      <published>2026-08-10T00:00:00.000Z</published>
      <updated>2026-08-10T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/e-mail/e-mail/"/>
      <summary type="text">通过Cloudflare转发邮件并利用resend的smtp服务发送邮件</summary>
      <content type="html"><![CDATA[<section><h1>1.前言<a href="#1前言"><span>#</span></a></h1><p>当你买了自己的第一个域名后，看到<a href="#">xxx@163.com</a>、<a href="#">xxx@gmail.com</a>、<a href="#">xxx@outlook.com</a>这些邮箱，是否想把@后面换成自己的域名？</p><p>我猜你肯定很想，本文就是利用Cloudflare+Resend实现自己的域名邮箱也能收发邮件</p><p>不过在开始之前，你需要有下列东西：</p><ul>
<li>自己的域名，并解析到Cloudflare如果没有的话还是先去买一个吧？</li>
<li>一个能正常使用的邮箱</li>
<li>良好的网络环境</li>
</ul></section>
<section><h1>2.原理<a href="#2原理"><span>#</span></a></h1><section><h3>接收邮件<a href="#接收邮件"><span>#</span></a></h3><p>在Cloudflare中利用Cloudflare的邮箱路由规则，在DNS中添加CF的MX解析后，所有发到你域名邮箱的邮件会转发到你设置的可用邮箱</p><div><div><div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>邮件</p></span></div><div><span><p>你的域名邮箱</p></span></div><div><span><p>Cloudflare</p></span></div><div><span><p>自己的邮箱</p></span></div>
</div><div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>邮件</p></span></div><div><span><p>你的域名邮箱</p></span></div><div><span><p>Cloudflare</p></span></div><div><span><p>自己的邮箱</p></span></div>
</div></div></div></section><section><h3>发送邮件<a href="#发送邮件"><span>#</span></a></h3><p>在Resend中绑定自己的域名，并解析DNS，利用resend提供的SMTP服务实现发送邮件</p><div><div><div><div><span></span></div><div><span></span></div><div><span><p>SMTP发送邮件</p></span></div><div><span><p>Resend服务</p></span></div><div><span><p>目标邮箱</p></span></div>
</div><div><div><span></span></div><div><span></span></div><div><span><p>SMTP发送邮件</p></span></div><div><span><p>Resend服务</p></span></div><div><span><p>目标邮箱</p></span></div>
</div></div></div></section></section>
<section><h1>3.操作步骤<a href="#3操作步骤"><span>#</span></a></h1><section><h3>3.1接收邮件<a href="#31接收邮件"><span>#</span></a></h3><p>登录Cloudflare，来到你的域名的页面，并打开左侧栏中电子邮件-电子邮件路由选项
<img alt="" loading="lazy" width="267" height="884" src="/_astro/Pasted%20image%2020260810102709.B4npQrvC_wan0k.webp" /></p><p>接着打开设置选项，点击下方添加缺失记录按钮
<img alt="" loading="lazy" width="1649" height="937" src="/_astro/Pasted%20image%2020260810102849.DfMutwsc_ZIygHo.webp" /></p><p>然后点击路由规则选项，点击右侧创建路由规则
<img alt="" loading="lazy" width="1644" height="948" src="/_astro/Pasted%20image%2020260810102934.kNdY07ky_Z1kivrL.webp" /></p><p>按照下图填写，填写完毕后点击保存
<img alt="" loading="lazy" width="1655" height="947" src="/_astro/Pasted%20image%2020260810103233.joQv5zPJ_9uCa6.webp" /></p><p>保存完毕后，查看你正在使用的邮箱，稍等片刻，你可以看到一封Cloudflare发来的验证邮件，点击Verify email address按钮，验证你上步填写的邮箱是否可用
<img alt="" loading="lazy" width="1023" height="829" src="/_astro/Pasted%20image%2020260810103503.B49XRHHq_1sifNL.webp" />
<img alt="" loading="lazy" width="732" height="316" src="/_astro/Pasted%20image%2020260810103611.DZ9_2gbw_1PsFNG.webp" />
返回到邮件路由-路由规则，配置正常的话应该为下图所示
<img alt="" loading="lazy" width="1652" height="946" src="/_astro/Pasted%20image%2020260810103651.B0rOV4fU_1qjJ0B.webp" />
接着你可以用其他邮箱（或者刚才填写的邮箱）向你配置的域名邮箱（例如我的是<a href="#">test@jerry-nis.top</a>）发送邮件测试
<img alt="" loading="lazy" width="814" height="410" src="/_astro/Pasted%20image%2020260810104112.1fyoUIhL_ZR7jfA.webp" /></p><p>至此你可以用你的域名邮箱接收短信了，非常的有逼格。</p></section><section><h3>3.2发送邮件<a href="#32发送邮件"><span>#</span></a></h3><p>打开<a href="https://resend.com/" target="_blank">Resend</a>,注册一个账号（推荐使用邮箱注册）
注册完成后，来到控制台，点击左侧侧边栏的Domains选项卡，并点击右侧的Add domain按钮
<img alt="" loading="lazy" width="1912" height="948" src="/_astro/Pasted%20image%2020260810104804.CrXp9mjM_RARE1.webp" /></p><p>按照下图填写
<img alt="" loading="lazy" width="1724" height="948" src="/_astro/Pasted%20image%2020260810105052.B-NzzLvi_Z1pppwX.webp" />
接着会提示需要配置DNS，由于我们使用的是cloudflare，所以我们直接点击Auto configure
<img alt="" loading="lazy" width="1655" height="932" src="/_astro/Pasted%20image%2020260810105218.F3AL4Vpn_1GmKnJ.webp" /></p><p>接着会弹出Cloudflare授权，我们点击授权按钮即可
<img alt="" loading="lazy" width="960" height="540" src="/_astro/Pasted%20image%2020260810105323.M90z2OiO_Z1sN1k0.webp" />
页面会回到Resend控制台，配置正常应该会显示如下
<img alt="" loading="lazy" width="1912" height="948" src="/_astro/Pasted%20image%2020260810105942.MNHb6yUL_bKCnM.webp" />
接着点击左侧侧边栏的API keys，并点击右侧的Create API keys，在弹出的窗口中填写名称并点击Add创建
<img alt="" loading="lazy" width="1912" height="948" src="/_astro/Pasted%20image%2020260810110041.DOh9H7Aw_Z2rFO20.webp" />
<img alt="" loading="lazy" width="521" height="398" src="/_astro/Pasted%20image%2020260810110108.BnRKu6yi_2vQc2g.webp" />
创建后会给你一串密钥，务必保存好，因为这是SMTP服务的密码
<img alt="" loading="lazy" width="513" height="262" src="/_astro/Pasted%20image%2020260810110201.eESRVuIl_Zc42yk.webp" /></p><section><h4>3.2.1功能验证与使用<a href="#321功能验证与使用"><span>#</span></a></h4><p>前往<a href="https://www.toolnb.com/tools/testsmtp.html" target="_blank">SMTP测试工具</a>测试邮件发送
<img alt="" loading="lazy" width="853" height="220" src="/_astro/Pasted%20image%2020260810111525.D_1mFU1C_1m3067.webp" />
<img alt="" loading="lazy" width="1093" height="304" src="/_astro/Pasted%20image%2020260810111549.BS5MjnNB_Z2kkKCU.webp" /></p><p>SMTP客户端配置</p><ul>
<li>服务器：smtp.resend.com</li>
<li>端口：465</li>
<li>账户：resend</li>
<li>密码：API 密钥</li>
</ul><p>使用：沿用 Gmail 客户端配置模式，将发送邮件的 SMTP 服务配置改为 Resend 的配置参数。</p><p>更多示例参考 <a href="https://resend.com/docs/send-with-smtp" target="_blank">官方帮助文档</a></p></section></section></section>
<section><h1>小结<a href="#小结"><span>#</span></a></h1><p>至此，你可以利用你的域名邮箱接收邮件；也可以利用SMTP服务发送邮件了，自定义程度极高。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/gith/gith/</id>
      <title type="text">Git 推送被拒与合并冲突解决方案</title>
      <published>2026-08-02T00:00:00.000Z</published>
      <updated>2026-08-02T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/gith/gith/"/>
      <summary type="text">从 non-fast-forward 到分支保护，从冲突标记到 --force-with-lease，一篇覆盖推送被拒与冲突解决的完整手册，</summary>
      <content type="html"><![CDATA[<blockquote><p>这篇教程把 <strong>“推送被拒”</strong> 和 <strong>“合并冲突”</strong> 这两类最让新手崩溃的 Git 问题拆成可照做的步骤。每个场景都给出 <strong>报错原文 → 原因 → 解决命令</strong>，并附一张决策图帮你快速定位。建议先看第 1 节理解原理，遇到具体报错直接跳到对应场景。</p></blockquote>
<section><h2>目录<a href="#目录"><span>#</span></a></h2><ol>
<li><a href="#%E5%8E%9F%E7%90%86%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E6%8B%92%E7%BB%9D%E6%8E%A8%E9%80%81">原理：为什么会拒绝推送</a></li>
<li><a href="#%E6%8A%A5%E9%94%99%E9%80%9F%E6%9F%A5%E8%A1%A8%E5%AF%B9%E5%8F%B7%E5%85%A5%E5%BA%A7">报错速查表：对号入座</a></li>
<li><a href="#non-fast-forward%E8%BF%9C%E7%A8%8B%E5%B7%B2%E6%9C%89%E6%96%B0%E6%8F%90%E4%BA%A4">non-fast-forward：远程已有新提交</a></li>
<li><a href="#fetch-first%E6%9C%AC%E8%B4%A8%E5%90%8C%E6%BA%90%E7%9A%84%E6%8F%90%E7%A4%BA">fetch first：本质同源的提示</a></li>
<li><a href="#permission-denied%E6%9D%83%E9%99%90%E6%88%96%E8%AE%A4%E8%AF%81%E9%97%AE%E9%A2%98">Permission denied：权限或认证问题</a></li>
<li><a href="#protected-branch%E5%88%86%E6%94%AF%E4%BF%9D%E6%8A%A4%E6%8B%A6%E6%88%AA">protected branch：分支保护拦截</a></li>
<li><a href="#force-push-%E8%A2%AB%E6%8B%92%E6%94%B9%E7%94%A8-force-with-lease">force push 被拒：改用 force-with-lease</a></li>
<li><a href="#%E5%A4%A7%E6%96%87%E4%BB%B6%E4%B8%8E-hook-%E6%8B%A6%E6%88%AA">大文件与 hook 拦截</a></li>
<li><a href="#%E5%90%88%E5%B9%B6%E5%86%B2%E7%AA%81%E5%AE%8C%E6%95%B4%E8%A7%A3%E5%86%B3%E6%B5%81%E7%A8%8B">合并冲突：完整解决流程</a></li>
<li><a href="#rebase-%E5%86%B2%E7%AA%81continue--skip--abort">rebase 冲突：continue / skip / abort</a></li>
<li><a href="#merge-%E8%BF%98%E6%98%AF-rebase%E6%80%8E%E4%B9%88%E9%80%89">merge 还是 rebase：怎么选</a></li>
<li><a href="#%E9%A2%84%E9%98%B2%E5%86%B2%E7%AA%81%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">预防冲突的最佳实践</a></li>
<li><a href="#%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E8%A1%A8">命令速查表</a></li>
</ol><hr /></section>
<section><h2>原理：为什么会拒绝推送<a href="#原理为什么会拒绝推送"><span>#</span></a></h2><p>Git 是一个<strong>分布式版本控制系统</strong>，本地仓库和远程仓库各自维护一串提交（commit）历史。当你执行 <code>git push</code> 时，Git 会把本地的新提交追加到远程分支的末尾。但这个”追加”有一个硬性前提：远程分支的当前提交，必须是你本地历史的<strong>直接祖先</strong>。</p><p>如果在你提交期间，别人已经往远程推了新提交，远程分支就”往前走”了。这时你的本地历史和远程历史就出现了<strong>分叉（divergence）</strong>——本地有远程没有的提交，远程也有本地没有的提交。Git 为了不丢弃任何人的工作，会拒绝你的推送，这就叫 <strong>non-fast-forward</strong>。</p><div><div><div>mainfeatureABC 你的提交D 同事的提交E 同事的提交
</div><div>mainfeatureABC 你的提交D 同事的提交E 同事的提交
</div></div></div><blockquote><p><strong>图 1</strong>：main 与 feature 分叉——你的 C 提交与远程的 D、E 互不包含，直接 push 必然 non-fast-forward。</p></blockquote><p>所谓 <strong>fast-forward（快进）</strong>，就是远程分支没有任何新提交，Git 只需把分支指针从 B 直接挪到 C，历史是一条直线，没有任何风险。一旦分叉，就只能通过 <strong>merge（合并）</strong> 或 <strong>rebase（变基）</strong> 把两条线重新整合成一条，然后才能推送。</p><blockquote><p>💡 <strong>一句话记住</strong>：推送被拒 ≠ 代码有 bug，而是 Git 在说：“远程变了，请你先把别人的改动整合进来再推。” 拒绝推送是 Git 的<strong>保护机制</strong>，不是错误。</p></blockquote><hr /></section>
<section><h2>报错速查表：对号入座<a href="#报错速查表对号入座"><span>#</span></a></h2><p>先看报错里出现的关键词，对照下表跳到对应章节。这是整篇教程的”急诊分诊台”。</p>

<table><thead><tr><th>报错关键词</th><th>含义</th><th>根因</th><th>跳转</th></tr></thead><tbody><tr><td><code>non-fast-forward</code></td><td>无法快进推送</td><td>远程已有你本地没有的新提交</td><td><a href="#non-fast-forward%E8%BF%9C%E7%A8%8B%E5%B7%B2%E6%9C%89%E6%96%B0%E6%8F%90%E4%BA%A4">§3</a></td></tr><tr><td><code>fetch first</code></td><td>请先拉取</td><td>同上，Git 提示你先 fetch</td><td><a href="#fetch-first%E6%9C%AC%E8%B4%A8%E5%90%8C%E6%BA%90%E7%9A%84%E6%8F%90%E7%A4%BA">§4</a></td></tr><tr><td><code>Permission denied</code> / <code>403</code></td><td>权限被拒</td><td>认证失败、无写权限、HTTPS 凭据错误</td><td><a href="#permission-denied%E6%9D%83%E9%99%90%E6%88%96%E8%AE%A4%E8%AF%81%E9%97%AE%E9%A2%98">§5</a></td></tr><tr><td><code>protected branch</code> / <code>cannot force</code></td><td>分支受保护</td><td>平台规则禁止直推/强推</td><td><a href="#protected-branch%E5%88%86%E6%94%AF%E4%BF%9D%E6%8A%A4%E6%8B%A6%E6%88%AA">§6</a></td></tr><tr><td><code>! [rejected] (fetch first)</code> 且用了 rebase</td><td>变基后强推被拦</td><td>需要 force 但用了普通 push</td><td><a href="#force-push-%E8%A2%AB%E6%8B%92%E6%94%B9%E7%94%A8-force-with-lease">§7</a></td></tr><tr><td><code>pre-receive hook declined</code></td><td>服务端钩子拒绝</td><td>大文件、提交信息规范、CI 校验未过</td><td><a href="#%E5%A4%A7%E6%96%87%E4%BB%B6%E4%B8%8E-hook-%E6%8B%A6%E6%88%AA">§8</a></td></tr><tr><td><code>CONFLICT (content)</code></td><td>合并冲突</td><td>同一文件同一处被双方都改了</td><td><a href="#%E5%90%88%E5%B9%B6%E5%86%B2%E7%AA%81%E5%AE%8C%E6%95%B4%E8%A7%A3%E5%86%B3%E6%B5%81%E7%A8%8B">§9</a></td></tr></tbody></table><div><div><div><div><span></span></div><div><span><p>non-fast-forward / fetch first</p></span></div><div><span><p>Permission denied / 403</p></span></div><div><span><p>protected / cannot force</p></span></div><div><span><p>pre-receive declined</p></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>是</p></span></div><div><span><p>否</p></span></div><div><span></span></div><div><span><p>git push 被拒</p></span></div><div><span><p>报错关键词?</p></span></div><div><span><p>远程有新提交</p></span></div><div><span><p>认证或权限</p></span></div><div><span><p>分支保护</p></span></div><div><span><p>服务端钩子</p></span></div><div><span><p>fetch + merge 或 pull --rebase</p></span></div><div><span><p>检查凭据 / 换 SSH / 加权限</p></span></div><div><span><p>走 PR 或临时关闭保护</p></span></div><div><span><p>看钩子日志修问题</p></span></div><div><span><p>是否产生 CONFLICT?</p></span></div><div><span><p>解决冲突 §9/§10</p></span></div><div><span><p>重新 push ✓</p></span></div>
</div><div><div><span></span></div><div><span><p>non-fast-forward / fetch first</p></span></div><div><span><p>Permission denied / 403</p></span></div><div><span><p>protected / cannot force</p></span></div><div><span><p>pre-receive declined</p></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>是</p></span></div><div><span><p>否</p></span></div><div><span></span></div><div><span><p>git push 被拒</p></span></div><div><span><p>报错关键词?</p></span></div><div><span><p>远程有新提交</p></span></div><div><span><p>认证或权限</p></span></div><div><span><p>分支保护</p></span></div><div><span><p>服务端钩子</p></span></div><div><span><p>fetch + merge 或 pull --rebase</p></span></div><div><span><p>检查凭据 / 换 SSH / 加权限</p></span></div><div><span><p>走 PR 或临时关闭保护</p></span></div><div><span><p>看钩子日志修问题</p></span></div><div><span><p>是否产生 CONFLICT?</p></span></div><div><span><p>解决冲突 §9/§10</p></span></div><div><span><p>重新 push ✓</p></span></div>
</div></div></div><blockquote><p><strong>图 2</strong>：推送被拒决策树——按报错分支处理，绝大多数情况落在左侧路径。</p></blockquote><hr /></section>
<section><h2>non-fast-forward：远程已有新提交<a href="#non-fast-forward远程已有新提交"><span>#</span></a></h2><p>这是<strong>最高频</strong>的推送被拒场景。典型报错长这样：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>! [rejected]        main -&gt; main (non-fast-forward)</span></div></div><div><div><div>2</div></div><div><span>error: failed to push some refs to 'github.com:you/repo.git'</span></div></div><div><div><div>3</div></div><div><span>hint: Updates were rejected because the tip of your current branch is behind</span></div></div><div><div><div>4</div></div><div><span>hint: its remote counterpart. Integrate the remote changes (e.g.</span></div></div><div><div><div>5</div></div><div><span>hint: 'git pull ...') before pushing again.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>解决思路只有两条路：<strong>合并（merge）</strong> 或 <strong>变基（rebase）</strong>。两者都会把远程的新提交整合进本地，区别在于历史长什么样。</p><section><h3>方案 A：merge 合并（最稳妥，推荐新手）<a href="#方案-amerge-合并最稳妥推荐新手"><span>#</span></a></h3><p>把远程改动拉下来并与本地合并，产生一个合并提交（merge commit），历史保留分叉再汇合的形状。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 拉取远程并自动合并（= fetch + merge）</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>pull</span><span> </span><span>origin</span><span> </span><span>main</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 如有冲突，解决后继续（见 §9）</span></div></div><div><div><div>5</div></div><div><span># 3. 解决完，重新推送</span></div></div><div><div><div>6</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>origin</span><span> </span><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>方案 B：rebase 变基（历史更线性，推荐进阶）<a href="#方案-brebase-变基历史更线性推荐进阶"><span>#</span></a></h3><p>把你的本地提交”摘下来”，放到远程最新提交的后面，历史变成一条直线，没有合并提交。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 拉取并以 rebase 方式整合（推荐）</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>pull</span><span> </span><span>--rebase</span><span> </span><span>origin</span><span> </span><span>main</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 如有冲突，逐个解决后继续（见 §10）</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>rebase</span><span> </span><span>--continue</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 整合完成后推送</span></div></div><div><div><div>8</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>origin</span><span> </span><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>💡 <strong>怎么选</strong>：团队协作、共享分支（如 main）优先 <code>pull --rebase</code>，历史干净；个人特性分支或怕麻烦就用 <code>git pull</code>（默认 merge）。想一劳永逸，看 <a href="#%E9%A2%84%E9%98%B2%E5%86%B2%E7%AA%81%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">§12</a> 把 rebase 设为默认。</p></blockquote><blockquote><p>⚠️ <strong>千万别这么做</strong>：报错后直接 <code>git push -f</code> 强推覆盖远程——这会<strong>永久丢弃</strong>同事已经推送的提交，是协作中的大忌。除非你 100% 确定远程那些提交该删，否则永远先整合再推。</p></blockquote><hr /></section></section>
<section><h2>fetch first：本质同源的提示<a href="#fetch-first本质同源的提示"><span>#</span></a></h2><p>有时报错不是 <code>non-fast-forward</code>，而是更”客气”的 <code>fetch first</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>! [rejected]        main -&gt; main (fetch first)</span></div></div><div><div><div>2</div></div><div><span>error: failed to push some refs to 'github.com:you/repo.git'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这跟上一节是<strong>同一回事</strong>，只是 Git 给出的措辞不同——它直接告诉你”先 fetch 一下”。本质都是远程领先于本地。解决方法完全相同：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 二选一</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>pull</span><span> </span><span>--rebase</span><span> </span><span>origin</span><span> </span><span>main</span><span>   </span><span># 线性历史</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>pull</span><span> </span><span>origin</span><span> </span><span>main</span><span>             </span><span># 产生合并提交</span></div></div><div><div><div>4</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>origin</span><span> </span><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>⚠️ <strong>区分 fetch 与 pull</strong>：<code>git fetch</code> 只下载远程更新到本地的远程跟踪分支（<code>origin/main</code>），<strong>不动</strong>你的工作区；<code>git pull</code> = <code>fetch</code> + <code>merge</code>，会直接改动工作区。想先看看远程改了啥再决定怎么整合，用 <code>fetch</code> 更安全。</p></blockquote><hr /></section>
<section><h2>Permission denied：权限或认证问题<a href="#permission-denied权限或认证问题"><span>#</span></a></h2><p>如果报错跟历史无关，而是认证/权限类，常见形式：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>remote: Permission to you/repo.git denied to otheruser.</span></div></div><div><div><div>2</div></div><div><span>fatal: unable to access 'https://github.com/you/repo.git/':</span></div></div><div><div><div>3</div></div><div><span>The requested URL returned error: 403</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>常见原因与对策<a href="#常见原因与对策"><span>#</span></a></h3>

<table><thead><tr><th>原因</th><th>现象</th><th>解决</th></tr></thead><tbody><tr><td>HTTPS 密码填错 / 用了登录密码</td><td>反复提示输密码、403</td><td>GitHub 已不接受账号密码，需用 <strong>Personal Access Token</strong> 当密码</td></tr><tr><td>凭据缓存了旧账号</td><td>提示 denied to otheruser</td><td>清除凭据：Windows 用”凭据管理器”，或 <code>git credential-manager delete</code></td></tr><tr><td>没有仓库写权限</td><td>403 / Permission denied</td><td>让仓库 owner 把你加为 Collaborator，或 fork 后提 PR</td></tr><tr><td>SSH 密钥未配置</td><td>Permission denied (publickey)</td><td>生成密钥并添加到平台：<code>ssh-keygen</code> → 复制公钥到 GitHub 设置</td></tr><tr><td>远程地址写错</td><td>推到别人的仓库被拒</td><td><code>git remote -v</code> 检查，<code>git remote set-url origin &lt;url&gt;</code> 修正</td></tr></tbody></table><section><h4>切换到 SSH（推荐，避免反复输密码）<a href="#切换到-ssh推荐避免反复输密码"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看当前远程地址</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>-v</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 把 HTTPS 换成 SSH</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>set-url</span><span> </span><span>origin</span><span> </span><span>git@github.com:you/repo.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>💡 <strong>验证 SSH 是否通</strong>：<code>ssh -T git@github.com</code> 返回 “Hi username! You’ve successfully authenticated” 即表示密钥配置成功。</p></blockquote><hr /></section></section></section>
<section><h2>protected branch：分支保护拦截<a href="#protected-branch分支保护拦截"><span>#</span></a></h2><p>GitHub、GitLab、Gitea 等平台支持对分支设置<strong>保护规则</strong>，禁止直接推送或强制推送，强制走 Pull Request。报错类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>remote: error: GH006: Protected branch update failed for refs/heads/main.</span></div></div><div><div><div>2</div></div><div><span>remote: error: Cannot force-push to a protected branch.</span></div></div><div><div><div>3</div></div><div><span>remote: error: Changes must be made through a pull request.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>正确做法：走 Pull Request<a href="#正确做法走-pull-request"><span>#</span></a></h3><ol>
<li><strong>新建分支并提交</strong>：别直接动 main，在特性分支上开发：<code>git checkout -b feature/x</code> → 提交 → <code>git push -u origin feature/x</code></li>
<li><strong>发起 Pull Request</strong>：在平台上从 feature 分支向 main 发起 PR，请求 review。</li>
<li><strong>通过后合并</strong>：review 通过后在平台上点 Merge，或本地合并后推送（前提是你有合并权限）。</li>
</ol></section><section><h3>如果你是管理员，需要临时强推<a href="#如果你是管理员需要临时强推"><span>#</span></a></h3><p>到仓库 <strong>Settings → Branches → Branch protection rules</strong>，临时关闭 “Require a pull request” 或 “Allow force pushes”，推完再开回来。<strong>务必推完立刻恢复保护规则</strong>。</p><blockquote><p>⚠️ <strong>main 分支永远不要强推</strong>：即便你有权限，对 main/develop 这类共享分支强推会让所有人的本地仓库错乱。强推只该用在<strong>自己的特性分支</strong>上（见 §7）。</p></blockquote><hr /></section></section>
<section><h2>force push 被拒：改用 force-with-lease<a href="#force-push-被拒改用-force-with-lease"><span>#</span></a></h2><p>当你对已推送的提交做过 <code>commit --amend</code>、<code>rebase</code> 或 <code>reset</code>，本地提交的 hash 变了，普通 push 会因 non-fast-forward 被拒，这时确实需要强制推送。</p><p>但 <strong>永远不要用 <code>git push -f</code></strong>，而要用更安全的 <strong><code>--force-with-lease</code></strong>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># ❌ 危险：无条件覆盖，可能踩掉别人的提交</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>-f</span><span> </span><span>origin</span><span> </span><span>feature/x</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># ✓ 安全：仅当远程没被别人更新时才覆盖</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>--force-with-lease</span><span> </span><span>origin</span><span> </span><span>feature/x</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>—force-with-lease 的保护机制<a href="#force-with-lease-的保护机制"><span>#</span></a></h4><p>它会在推送前检查：远程分支的当前指针，是否还停留在你上次 <code>fetch</code> 时记录的位置。如果<strong>有人在此期间推了新提交</strong>，强推会被拒绝——从而避免你无意中覆盖同事的工作。</p><blockquote><p>💡 <strong>设个别名更省事</strong>：<code>git config --global alias.pushf "push --force-with-lease"</code>，以后 <code>git pushf</code> 即可安全强推。</p></blockquote><blockquote><p>⚠️ <strong>强推的两条铁律</strong>：① 只在自己的特性分支上强推，<strong>绝不</strong>对共享分支强推；② 永远用 <code>--force-with-lease</code> 而非 <code>-f</code>。如果 lease 也被拒，说明远程真有新东西，老老实实 pull 整合。</p></blockquote><hr /></section></section>
<section><h2>大文件与 hook 拦截<a href="#大文件与-hook-拦截"><span>#</span></a></h2><section><h3>大文件导致推送失败<a href="#大文件导致推送失败"><span>#</span></a></h3><p>GitHub 单文件限制 100MB，超过会直接拒绝：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>remote: error: File large.zip is 134.5 MB; this exceeds GitHub's file size limit of 100.00 MB</span></div></div><div><div><div>2</div></div><div><span>remote: error: GH001: Large files detected.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 方案 1：用 Git LFS 管理大文件</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>lfs</span><span> </span><span>install</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>lfs</span><span> </span><span>track</span><span> </span><span>"*.zip"</span></div></div><div><div><div>4</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>.gitattributes</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>large.zip</span></div></div><div><div><div>6</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"add large file via LFS"</span></div></div><div><div><div>7</div></div><div><span>git</span><span> </span><span>push</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 方案 2：若大文件已误提交，用 filter 从历史移除</span></div></div><div><div><div>10</div></div><div><span>git</span><span> </span><span>rm</span><span> </span><span>--cached</span><span> </span><span>large.zip</span></div></div><div><div><div>11</div></div><div><span># 用 git filter-repo 彻底清除历史中的大文件</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>pre-receive / 服务端 hook 拒绝<a href="#pre-receive--服务端-hook-拒绝"><span>#</span></a></h3><p>平台侧的钩子会校验提交信息格式、文件命名、是否通过 CI 等，不达标就 <code>declined</code>。这类报错必须按钩子给出的提示修——常见如提交信息不符合 Conventional Commits 规范、未关联 issue、代码未通过 lint。</p><blockquote><p>⚠️ <strong>误提交大文件后的陷阱</strong>：如果你已经 commit 了 100MB 文件，即便 <code>git rm</code> 删掉再提交，<strong>历史里那个大文件依然存在</strong>，push 还是会失败。必须用 <code>git filter-repo</code> 或 <code>git rebase -i</code> 把它从历史中彻底抹除，再强推。</p></blockquote><hr /></section></section>
<section><h2>合并冲突：完整解决流程<a href="#合并冲突完整解决流程"><span>#</span></a></h2><p>当 <code>git pull</code>、<code>git merge</code> 或 <code>git rebase</code> 时，如果双方改动了<strong>同一文件的同一区域</strong>，Git 无法自动合并，就会暂停并报冲突。</p><section><h3>冲突长什么样<a href="#冲突长什么样"><span>#</span></a></h3><p>Git 会在冲突文件里插入冲突标记，把两边的代码都保留下来让你二选一或合并：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</span></div></div><div><div><div>2</div></div><div><span>const title = "我的版本";      ← 你当前分支（HEAD）的改动</span></div></div><div><div><div>3</div></div><div><span>=======</span></div></div><div><div><div>4</div></div><div><span>const title = "同事的版本";    ← 进来的那一方的改动</span></div></div><div><div><div>5</div></div><div><span>&gt;&gt;&gt;&gt;&gt;&gt;&gt; incoming-branch</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>三组标记的含义：</p><ul>
<li><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code> 到 <code>=======</code>：你当前分支（HEAD）的内容</li>
<li><code>=======</code> 到 <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>：进来的对方分支的内容</li>
<li><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; 分支名</code>：标记对方分支来源</li>
</ul></section><section><h3>解决步骤（merge 场景）<a href="#解决步骤merge-场景"><span>#</span></a></h3><ol>
<li><strong>查看哪些文件冲突</strong>：<code>git status</code> 会列出 “Unmerged paths” 下所有冲突文件，标 <code>both modified</code>。</li>
<li><strong>打开冲突文件手动编辑</strong>：决定保留哪部分、丢弃哪部分，或把两边逻辑合并成新代码。<strong>删掉所有冲突标记</strong>（<code>&lt;&lt;&lt;</code>、<code>===</code>、<code>&gt;&gt;&gt;</code>），保留最终正确内容。</li>
<li><strong>标记冲突已解决</strong>：<code>git add &lt;文件&gt;</code>（不是 commit，只是加入暂存区表示已解决）。</li>
<li><strong>完成合并</strong>：<code>git commit</code> 生成合并提交（merge 场景），通常会自动弹出默认合并信息，保存退出即可。</li>
<li><strong>继续推送</strong>：<code>git push</code>，这次就能成功了。</li>
</ol></section><section><h3>用工具解决更高效<a href="#用工具解决更高效"><span>#</span></a></h3><p>手动改容易漏删标记，推荐用可视化工具：VS Code 内置的 <strong>“Merge Editor”</strong>（点击冲突文件的 “Resolve in Merge Editor”）、JetBrains 系（IDEA/PyCharm）的三栏合并窗口、或命令行 <code>git mergetool</code>。</p></section><section><h3>想放弃怎么办<a href="#想放弃怎么办"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># merge 冲突想反悔，回到合并前状态</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>merge</span><span> </span><span>--abort</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># rebase 冲突想反悔</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>rebase</span><span> </span><span>--abort</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看还没解决的冲突文件</span></div></div><div><div><div>8</div></div><div><span>git</span><span> </span><span>diff</span><span> </span><span>--name-only</span><span> </span><span>--diff-filter=U</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>💡 <strong>解决前先备份</strong>：冲突文件改坏了不好恢复，动手前先 <code>cp file file.bak</code> 或另开一个分支 <code>git stash</code> 当前状态，万一改崩了能回退。</p></blockquote><hr /></section></section>
<section><h2>rebase 冲突：continue / skip / abort<a href="#rebase-冲突continue--skip--abort"><span>#</span></a></h2><p>rebase 冲突的处理流程跟 merge 略有不同。rebase 是把你本地的提交<strong>一个个重放</strong>到远程最新提交之上，每重放一个都可能撞上冲突，所以可能要解决多次。</p><section><h3>rebase 冲突三连<a href="#rebase-冲突三连"><span>#</span></a></h3><ol>
<li><strong>解决当前文件的冲突</strong>：同样删标记、编辑成最终内容，然后 <code>git add &lt;文件&gt;</code>。</li>
<li><strong>继续重放下一个提交</strong>：<code>git rebase --continue</code>。注意：rebase 场景<strong>不要 commit</strong>，用 <code>--continue</code> 推进。若又遇冲突，重复步骤 1。</li>
<li><strong>全部重放完成</strong>：提示 “Successfully rebased” 后，<code>git push</code> 即可（若之前已推过该分支，需 <code>git push --force-with-lease</code>）。</li>
</ol></section><section><h3>三个关键命令<a href="#三个关键命令"><span>#</span></a></h3>

<table><thead><tr><th>命令</th><th>作用</th><th>何时用</th></tr></thead><tbody><tr><td><code>git rebase --continue</code></td><td>解决冲突后继续</td><td>改完、add 后推进</td></tr><tr><td><code>git rebase --skip</code></td><td>跳过当前提交</td><td>这个提交的改动已被远程包含、是空提交</td></tr><tr><td><code>git rebase --abort</code></td><td>放弃整个 rebase</td><td>改不下去了，回到 rebase 前状态</td></tr></tbody></table><blockquote><p>⚠️ <strong>rebase 中途别乱切分支</strong>：rebase 进行中工作区处于”游离”状态，此时 <code>git checkout</code> 切别的分支、<code>git pull</code> 都可能把状态搞乱。要么 <code>--abort</code> 退出，要么 <code>--continue</code> 走完，不要中途分心。</p></blockquote><hr /></section></section>
<section><h2>merge 还是 rebase：怎么选<a href="#merge-还是-rebase怎么选"><span>#</span></a></h2><p>两种整合方式各有取舍，理解差异才能选对：</p>

<table><thead><tr><th>对比维度</th><th>merge 合并</th><th>rebase 变基</th></tr></thead><tbody><tr><td>历史形状</td><td>保留分叉与汇合，真实记录</td><td>线性，像从未分叉过</td></tr><tr><td>合并提交</td><td>产生一个 merge commit</td><td>无，提交被重排</td></tr><tr><td>提交 hash</td><td>原提交不变</td><td>你的提交 hash 会改变</td></tr><tr><td>冲突解决</td><td>一次性解决全部</td><td>可能逐个提交多次解决</td></tr><tr><td>适用场景</td><td>共享分支、保留真实历史</td><td>个人特性分支、整理整洁历史</td></tr><tr><td>风险</td><td>低，不改写历史</td><td>已推送的分支 rebase 后需强推</td></tr></tbody></table><section><h4>黄金法则<a href="#黄金法则"><span>#</span></a></h4><p><strong>“不要 rebase 已经推送到公共分支、且他人在用的提交。”</strong> 因为 rebase 会改写 hash，别人 pull 下来会出现重复和混乱。自己的、没人依赖的特性分支随便 rebase；共享的 main/develop 老老实实 merge。</p><hr /></section></section>
<section><h2>预防冲突的最佳实践<a href="#预防冲突的最佳实践"><span>#</span></a></h2><p>冲突治标不如治本。下面这些习惯能让你<strong>少踩 90% 的坑</strong>：</p><ul>
<li><strong>勤拉取，小步提交。</strong> 每天开工先 <code>git pull --rebase</code>，频繁同步远程；别攒一大堆改动再推，分叉越大冲突越多。</li>
<li><strong>把 rebase 设为 pull 默认。</strong> <code>git config --global pull.rebase true</code>，以后 <code>git pull</code> 自动走 rebase，历史更干净。</li>
<li><strong>特性分支短命。</strong> 一个分支活越久，与 main 分叉越严重。功能做完尽快合并，别让分支挂两周。</li>
<li><strong>分工避免改同一处。</strong> 团队约定模块边界，减少多人同时改同一文件的概率。</li>
<li><strong>开启 git rerere 自动复用解决方案。</strong> <code>git config --global rerere.enabled true</code>，Git 会记住你解决过的冲突，下次遇到相同冲突自动套用。</li>
<li><strong>提交前先 pull。</strong> 养成 <code>commit → pull --rebase → push</code> 的固定节奏，而不是 commit 完直接 push。</li>
<li><strong>用 .gitignore 管好临时文件。</strong> 避免把本地配置、日志、构建产物提交，这些是冲突重灾区。</li>
</ul><blockquote><p>💡 <strong>rerere 是什么</strong>：“reuse recorded resolution”——重用已记录的解决方案。开启后，当你解决过一次某冲突，下次遇到完全相同的冲突块，Git 会自动按你上次的解决方式填好，连标记都不用删。在长期维护多个特性分支、反复 rebase 同一基准的工作流里特别省心。</p></blockquote><hr /></section>
<section><h2>命令速查表<a href="#命令速查表"><span>#</span></a></h2><p>把这张表存下来，遇到问题直接查。这是全文命令的浓缩版。</p>

<table><thead><tr><th>场景</th><th>命令</th></tr></thead><tbody><tr><td>拉取并合并（默认）</td><td><code>git pull origin main</code></td></tr><tr><td>拉取并变基（推荐）</td><td><code>git pull --rebase origin main</code></td></tr><tr><td>设 pull 默认走 rebase</td><td><code>git config --global pull.rebase true</code></td></tr><tr><td>只下载不动工作区</td><td><code>git fetch origin</code></td></tr><tr><td>查看冲突文件</td><td><code>git status</code></td></tr><tr><td>标记冲突已解决</td><td><code>git add &lt;文件&gt;</code></td></tr><tr><td>完成 merge 合并</td><td><code>git commit</code></td></tr><tr><td>rebase 继续推进</td><td><code>git rebase --continue</code></td></tr><tr><td>rebase 跳过当前提交</td><td><code>git rebase --skip</code></td></tr><tr><td>放弃 merge</td><td><code>git merge --abort</code></td></tr><tr><td>放弃 rebase</td><td><code>git rebase --abort</code></td></tr><tr><td>安全强推（务必用这个）</td><td><code>git push --force-with-lease</code></td></tr><tr><td>危险强推（勿用）</td><td><code>git push -f</code></td></tr><tr><td>查看远程地址</td><td><code>git remote -v</code></td></tr><tr><td>改远程地址为 SSH</td><td><code>git remote set-url origin git@github.com:you/repo.git</code></td></tr><tr><td>开启冲突复用</td><td><code>git config --global rerere.enabled true</code></td></tr><tr><td>管理大文件</td><td><code>git lfs track "*.zip"</code></td></tr><tr><td>验证 SSH</td><td><code>ssh -T git@github.com</code></td></tr></tbody></table><blockquote><p>💡 <strong>日常节奏口诀</strong>：<strong>开工先 pull，提交要小步；push 前再 pull，强推用 lease；冲突删标记，rebase 用 continue；共享分支只 merge，个人分支才 rebase。</strong></p></blockquote><hr /></section>
<section><h2>参考资料<a href="#参考资料"><span>#</span></a></h2><ol>
<li><a href="https://git-scm.com/docs/git-push" target="_blank">Git 官方文档, git-push Manual — force-with-lease 与 fast-forward 语义说明</a></li>
<li><a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing" target="_blank">Scott Chacon, Pro Git Book · Git 分支 - 变基（Rebasing）— fast-forward 与三方合并</a></li>
<li><a href="https://git-scm.com/docs/git-rerere" target="_blank">Git 官方文档, git-rerere Manual — 重用已记录的冲突解决方案</a></li>
<li><a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/about-protected-branches" target="_blank">GitHub Docs, About protected branches — 分支保护规则与强制推送限制</a></li>
<li><a href="https://www.atlassian.com/git/tutorials/merging-vs-rebasing" target="_blank">Atlassian Git Tutorial, Merging vs Rebasing — merge 与 rebase 策略对比</a></li>
</ol></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/arch/arch-1/</id>
      <title type="text">Arch Linux安装以及使用指南</title>
      <published>2026-07-30T00:00:00.000Z</published>
      <updated>2026-07-30T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/arch/arch-1/"/>
      <summary type="text">Arch Linux发行版与桌面环境的安装以及使用指南。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>下文Arch Linux简称为”Arch”.</p><p>Arch 是一个极简单的Linux发行版，它安装好以后只有一个<strong>黑不拉几的命令行</strong>，对小白并不是很友好，但当我们配置完毕后他会成为一个强大的工具。</p><p>Arch的特性就是<strong>滚动更新</strong>和<strong>pacman包管理器</strong>，拥有这两者你能获得时刻都是最新的系统以及便利迅速的包安装体验。
Arch还拥有强大的社区资源以及详细丰富的<a href="https://wiki.archlinux.org/" target="_blank">Wiki文档</a>，通过翻阅wiki你能快速了解掌握Arch的使用方法。</p><p>本文为Archlinux2026.07.01镜像、Vmware16虚拟机模拟安装，与实际情况近似，安装时请以实际情况为准。</p><p>什么？你怕这些命令会有错误？但是本文依据实际安装流程总结而得QwQ。</p><p>送给小白的部分注意事项：</p><ul>
<li>nano编辑器<code>Ctrl+O</code>为保存输出文件，<code>Ctrl+X</code>为关闭编辑器</li>
<li>磁盘分区、格式化和挂载部分注意自己的数据</li>
</ul></section>
<section><h1>安装指南<a href="#安装指南"><span>#</span></a></h1><section><h2>1.安装准备<a href="#1安装准备"><span>#</span></a></h2><section><h3>1.1下载安装镜像<a href="#11下载安装镜像"><span>#</span></a></h3><p>前往 Arch Linux 官方下载页面 <a href="https://archlinux.org/download" target="_blank">archlinux.org/download</a>，下载最新的 ISO 镜像文件（约 1 GB）。建议从国内镜像站下载以获得更快的速度：</p>

<table><thead><tr><th>镜像站</th><th>地址</th></tr></thead><tbody><tr><td>清华大学 TUNA</td><td><code>https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/</code></td></tr><tr><td>中科大 USTC</td><td><code>https://mirrors.ustc.edu.cn/archlinux/iso/latest/</code></td></tr><tr><td>上海交大 SJTUG</td><td><code>https://mirror.sjtu.edu.cn/archlinux/iso/latest/</code></td></tr><tr><td>华为云</td><td><code>https://mirrors.huaweicloud.com/archlinux/iso/latest/</code></td></tr></tbody></table></section><section><h3>1.2制作U盘启动盘<a href="#12制作u盘启动盘"><span>#</span></a></h3><section><h4>Windows 系统<a href="#windows-系统"><span>#</span></a></h4><div><div><div></div><div>提示</div></div><div><p>下方两种操作均会擦除/删除你U盘上的所有数据，请注意备份数据！</p></div></div><p>使用 <strong>Rufus</strong> 工具（免费开源）：</p><p>操作步骤</p><ol>
<li>下载 <a href="https://rufus.ie/" target="_blank">Rufus</a> 并运行</li>
<li>选择你的 U 盘设备</li>
<li>选择 Arch Linux ISO 文件</li>
<li>分区类型选择 <strong>GPT</strong>，目标系统类型选 <strong>UEFI</strong></li>
<li>点击「开始」，选择 <strong>以 DD 镜像模式写入</strong>（重要！）</li>
<li>等待写入完成</li>
</ol><div><div><div></div><div>务必选择 DD 模式</div></div><div><p>Rufus 默认使用 ISO 模式，但 Arch Linux 的 ISO 必须使用 <strong>DD 镜像模式</strong>写入，否则可能无法正常启动。</p></div></div></section><section><h4>Linux / macOS 系统<a href="#linux--macos-系统"><span>#</span></a></h4><p>使用 <code>dd</code> 命令直接写入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#先查看 U 盘设备名</span></div></div><div><div><div>2</div></div><div><span>$</span><span> </span><span>lsblk</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 取消挂载 U 盘（假设为 /dev/sdb）</span></div></div><div><div><div>5</div></div><div><span>$</span><span> </span><span>sudo</span><span> </span><span>umount</span><span> </span><span>/dev/sdb</span><span>*</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 写入镜像（注意 of= 后面是整个设备，不是分区）</span></div></div><div><div><div>8</div></div><div><span>$</span><span> </span><span>sudo</span><span> </span><span>dd</span><span> </span><span>if=archlinux-version-x86_64.iso</span><span> </span><span>of=/dev/sdb</span><span> </span><span>bs=4M</span><span> </span><span>status=progress</span><span> </span><span>oflag=sync</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 等待写入完成后同步</span></div></div><div><div><div>11</div></div><div><span>$</span><span> </span><span>sync</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>危险操作</div></div><div><p><code>dd</code> 命令中 <code>of=</code> 参数<strong>必须正确</strong>，写错设备会覆盖其他磁盘的数据！请务必通过 <code>lsblk</code> 确认 U 盘设备名。</p></div></div></section></section><section><h3>1.3BIOS / UEFI 设置<a href="#13bios--uefi-设置"><span>#</span></a></h3><p>将 U 盘插入电脑，开机时按下对应键进入 BIOS/UEFI 设置（不同品牌按键不同）：</p>

<table><thead><tr><th>品牌</th><th>进入 BIOS 按键</th><th>启动菜单按键</th></tr></thead><tbody><tr><td>联想 / ThinkPad</td><td>F1 / F2</td><td>F12</td></tr><tr><td>戴尔</td><td>F2</td><td>F12</td></tr><tr><td>惠普</td><td>F10 / Esc</td><td>F9</td></tr><tr><td>华硕</td><td>F2 / Del</td><td>Esc / F8</td></tr><tr><td>微星 / 技嘉</td><td>Del</td><td>F11 / F12</td></tr></tbody></table><p>在 BIOS 中需要完成以下设置：</p><ol>
<li><strong>关闭 Secure Boot（安全启动）</strong> — Arch 安装镜像不支持 Secure Boot<a href="#cite-1">[1]</a></li>
<li><strong>设置 U 盘为第一启动项</strong> — 在 Boot 菜单中将 U 盘移到最前</li>
<li><strong>确认引导模式为 UEFI</strong> — 确保没有启用 CSM/Legacy 模式</li>
<li><strong>关闭 Fast Boot（快速启动）</strong> — 避免 USB 设备初始化失败</li>
<li>保存并退出（通常按 F10）</li>
</ol></section></section><section><h2>2.进入安装流程<a href="#2进入安装流程"><span>#</span></a></h2><p>从 U 盘启动后，会出现引导菜单。选择 <strong>Arch Linux install medium</strong> 并按回车。稍等片刻后，系统会自动以 root 用户登录，并显示 Zsh 命令行提示符 `root@archiso ~ #</p><div><div><div></div><div>小技巧</div></div><div><p>如果你觉得终端字体太小（尤其在 HiDPI 屏幕上），可以执行 <code>setfont ter-132b</code> 放大字体。</p></div></div><p><img alt="" loading="lazy" width="642" height="480" src="/_astro/Pasted%20image%2020260729223733.Cu9lSzr7_1PE6xH.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729224142.VtCz-PGy_ZDVxIh.webp" /></p><section><h3>2.1连接网络<a href="#21连接网络"><span>#</span></a></h3><p>Arch 安装需要从网络下载软件包，因此必须先联网。</p><section><h4>有线网络<a href="#有线网络"><span>#</span></a></h4><p>如果使用网线，插入网线后通常会自动获取 IP 地址（DHCP），无需额外操作。</p></section><section><h4>无线网络 (Wi-Fi)<a href="#无线网络-wi-fi"><span>#</span></a></h4><p>使用 <code>iwctl</code> 工具连接 Wi-Fi：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#进入 iwctl 交互模式</span></div></div><div><div><div>2</div></div><div><span>iwctl</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 在 iwctl 提示符内执行：</span></div></div><div><div><div>5</div></div><div><span>device</span><span> </span><span>list</span><span>                                    </span><span># 查看无线网卡名（如 wlan0）</span></div></div><div><div><div>6</div></div><div><span>station</span><span> </span><span>wlan0</span><span> </span><span>scan</span><span>                            </span><span># 扫描网络</span></div></div><div><div><div>7</div></div><div><span>station</span><span> </span><span>wlan0</span><span> </span><span>get-networks</span><span>                    </span><span># 列出可用网络</span></div></div><div><div><div>8</div></div><div><span>station</span><span> </span><span>wlan0</span><span> </span><span>connect</span><span> </span><span>"你的WiFi名称"</span><span>           </span><span># 连接（会提示输入密码）</span></div></div><div><div><div>9</div></div><div><span>quit</span><span>                                            </span><span># 退出</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>验证网络连接<a href="#验证网络连接"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ping</span><span> </span><span>-c</span><span> </span><span>4</span><span> </span><span>archlinux.org</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>#如果能收到回复，说明网络正常</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="595" height="146" src="/_astro/Pasted%20image%2020260729225017.CWFVjRza_Z1XyHz7.webp" /></p></section></section><section><h3>2.2更新系统时钟<a href="#22更新系统时钟"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启用 NTP 时间同步</span></div></div><div><div><div>2</div></div><div><span>timedatectl</span><span> </span><span>set-ntp</span><span> </span><span>true</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看时间状态（确认 System clock synchronized: yes）</span></div></div><div><div><div>5</div></div><div><span>timedatectl</span><span> </span><span>status</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="541" height="164" src="/_astro/Pasted%20image%2020260729225434.BDJ0irC2_ZJ3alw.webp" /></p></section><section><h3>2.3更新镜像源（推荐）<a href="#23更新镜像源推荐"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用 reflector 自动选择中国地区最快的 5 个镜像</span></div></div><div><div><div>2</div></div><div><span>reflector</span><span> </span><span>--country</span><span> </span><span>China</span><span> </span><span>--age</span><span> </span><span>12</span><span> </span><span>--protocol</span><span> </span><span>https</span><span> </span><span>--sort</span><span> </span><span>rate</span><span> </span><span>--number</span><span> </span><span>5</span><span> </span><span>--save</span><span> </span><span>/etc/pacman.d/mirrorlist</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 或者手动编辑镜像列表，将中国镜像移到最前面</span></div></div><div><div><div>5</div></div><div><span>nano</span><span> </span><span>/etc/pacman.d/mirrorlist</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在文件中找到以下行，确认它们在列表顶部（如果被 <code>#</code> 注释了，请取消注释）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Server</span><span> </span><span>=</span><span> </span><span>https://mirrors.tuna.tsinghua.edu.cn/archlinux/</span><span>$repo</span><span>/os/</span><span>$arch</span></div></div><div><div><div>2</div></div><div><span>Server</span><span> </span><span>=</span><span> </span><span>https://mirrors.ustc.edu.cn/archlinux/</span><span>$repo</span><span>/os/</span><span>$arch</span></div></div><div><div><div>3</div></div><div><span>Server</span><span> </span><span>=</span><span> </span><span>https://mirrors.huaweicloud.com/archlinux/</span><span>$repo</span><span>/os/</span><span>$arch</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>3.磁盘分区<a href="#3磁盘分区"><span>#</span></a></h2><p>这是整个安装过程中最需要小心的步骤。本教程采用 <strong>UEFI + GPT</strong> 分区方案。</p><div><div><div></div><div>Warning</div></div><div><p>磁盘分区操作中含有擦除磁盘操作，请注意备份数据！</p></div></div><section><h3>3.1查看磁盘信息<a href="#31查看磁盘信息"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用 lsblk 查看磁盘和分区（推荐）</span></div></div><div><div><div>2</div></div><div><span>lsblk</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 或使用 fdisk 查看详细信息</span></div></div><div><div><div>5</div></div><div><span>fdisk</span><span> </span><span>-l</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>典型的输出如下，你需要找到你要安装 Arch 的目标磁盘：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>NAME</span><span>   </span><span>MAJ:MIN</span><span> </span><span>RM</span><span>   </span><span>SIZE</span><span> </span><span>RO</span><span> </span><span>TYPE</span><span> </span><span>MOUNTPOINTS</span></div></div><div><div><div>2</div></div><div><span>sda</span><span>      </span><span>8:0</span><span>    </span><span>0</span><span> </span><span>60G</span><span>  </span><span>0</span><span> </span><span>disk</span><span>               </span><span>←</span><span> </span><span>这是你的目标硬盘</span></div></div><div><div><div>3</div></div><div><span>sr0</span><span> </span><span>11:0</span><span>    </span><span>1</span><span> </span><span>1.5G</span><span>  </span><span>0</span><span> </span><span>rom</span><span>  </span><span>/run/archiso/bootmnt</span><span>             </span><span>←</span><span> </span><span>安装源</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="613" height="81" src="/_astro/Pasted%20image%2020260729230052.0mdhL6DZ_Z2asLD.webp" /></p><div><div><div></div><div>注意</div></div><div><p>请仔细确认你要操作的磁盘设备名。SATA 硬盘通常是 <code>/dev/sda</code>，NVMe 硬盘通常是 <code>/dev/nvme0n1</code>。**后续命令中的 **<code>/dev/sdX</code><strong>请替换为你的实际磁盘名</strong>。</p></div></div></section><section><h3>3.2分区方案<a href="#32分区方案"><span>#</span></a></h3><p>本教程采用以下分区方案（UEFI + GPT）：</p>

<table><thead><tr><th>挂载点</th><th>分区</th><th>分区类型</th><th>建议大小</th><th>文件系统</th></tr></thead><tbody><tr><td><code>/boot</code></td><td><code>/dev/sdX1</code></td><td>EFI System Partition</td><td>1 GiB</td><td>FAT32</td></tr><tr><td><code>[SWAP]</code></td><td><code>/dev/sdX2</code></td><td>Linux swap</td><td>≥ 4 GiB</td><td>swap</td></tr><tr><td><code>/</code></td><td><code>/dev/sdX3</code></td><td>Linux root (x86-64)</td><td>剩余空间</td><td>ext4</td></tr></tbody></table><div><div><div></div><div>建议</div></div><div><p>Swap 大小建议为物理内存的 1-2 倍。如果你有 16GB 内存，建议设 8-16GB swap。也可以安装后使用 <a href="https://wiki.archlinux.org/title/Zram" target="_blank">zram</a> 替代 swap 分区来节省磁盘空间<a href="#cite-1">[1]</a>。</p></div></div><section><h4>使用 cgdisk 进行分区（推荐，图形化 TUI）<a href="#使用-cgdisk-进行分区推荐图形化-tui"><span>#</span></a></h4><p>推荐使用 <code>cgdisk</code>，它有可视化界面，操作更直观：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cgdisk</span><span> </span><span>/dev/sdX</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h5>cgdisk 操作步骤<a href="#cgdisk-操作步骤"><span>#</span></a></h5><p><strong>创建第一个分区（EFI 引导分区）：</strong></p><ol>
<li>用方向键选中空闲空间，按回车选择 <code>[ New ]</code></li>
<li>First sector：直接回车（使用默认值）</li>
<li>Size in sectors：输入 <code>1G</code></li>
<li>Hex code or GUID：输入 <code>EF00</code>（EFI System Partition）</li>
<li>Enter new partition name：输入 <code>efi</code>（或直接回车）</li>
</ol><p><strong>创建第二个分区（Swap 交换分区）：</strong></p><ol>
<li>选中剩余空间，选择 <code>[ New ]</code></li>
<li>First sector：回车默认</li>
<li>Size：输入 <code>8G</code>（根据你的内存调整）</li>
<li>Hex code：输入 <code>8200</code>（Linux swap）</li>
<li>Name：输入 <code>swap</code></li>
</ol><p><strong>创建第三个分区（根分区）：</strong></p><ol>
<li>选中剩余空间，选择 <code>[ New ]</code></li>
<li>First sector：回车默认</li>
<li>Size：直接回车（使用全部剩余空间）</li>
<li>Hex code：输入 <code>8304</code>（Linux root x86-64）</li>
<li>Name：输入 <code>root</code></li>
</ol><p><strong>保存退出：</strong></p><ol>
<li>选择 <code>[ Write ]</code>，输入 <code>yes</code> 确认写入</li>
<li>选择 <code>[ Quit ]</code> 退出</li>
</ol><p>**长图教程警告？？！！**👇
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729230905._TcDvAaj_1Seryk.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231007.D729TU_H_ZnOsqF.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231026.aVZ9GKW5_ZsfznM.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232901.VA8R5uFU_Z1M1YMU.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231426.C2HDpEtB_gLBMD.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231511.BsxouD1e_ZTb9KY.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231606.CUtnP7PP_Z1vd8Sv.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729233024.BBc9o41N_Z2siNEy.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231753.DAE1_B1Y_21x84a.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231822.C0qfjWh7_ZEjDQ7.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729231949.B0xY-J1G_2dxdYQ.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232012.rfh2uMea_wHQR7.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232029.EDQiP5n5_CPrVX.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232101.6MqaMtN5_1q8p5g.webp" /><img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232121.D-mK5Dni_J5Es9.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232223.CcJFm2yP_1D5Wj1.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232355.Cnc4L73P_1QGmKQ.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260729232430.BkdwGZks_EkaCW.webp" /></p></section></section><section><h4>使用 fdisk 进行分区（命令行方式）<a href="#使用-fdisk-进行分区命令行方式"><span>#</span></a></h4><p>如果你更喜欢纯命令行，可以使用 <code>fdisk</code>：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># fdisk /dev/sdX</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 创建 GPT 分区表（如果磁盘已有分区，先删除）</span></div></div><div><div><div>4</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): g                    </span><span># 创建新的 GPT 分区表</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># === 创建 EFI 分区 ===</span></div></div><div><div><div>7</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): n                    </span><span># 新建分区</span></div></div><div><div><div>8</div></div><div><span>Partition</span><span> </span><span>number</span><span> (1-128, </span><span>default</span><span> </span><span>1</span><span>):     </span><span># 回车默认</span></div></div><div><div><div>9</div></div><div><span>First</span><span> </span><span>sector:</span><span>                             </span><span># 回车默认</span></div></div><div><div><div>10</div></div><div><span>Last</span><span> </span><span>sector:</span><span> </span><span>+1G</span><span>                           </span><span># 1GB 大小</span></div></div><div><div><div>11</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): t                    </span><span># 修改分区类型</span></div></div><div><div><div>12</div></div><div><span>Partition</span><span> </span><span>type:</span><span> </span><span>1</span><span>                           </span><span># 选择第一个分区</span></div></div><div><div><div>13</div></div><div><span>Hex</span><span> </span><span>code</span><span> </span><span>or</span><span> </span><span>alias:</span><span> </span><span>uefi</span><span>                    </span><span># 或输入 EF00</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># === 创建 Swap 分区 ===</span></div></div><div><div><div>16</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): n</span></div></div><div><div><div>17</div></div><div><span>Partition</span><span> </span><span>number</span><span> (2-128, </span><span>default</span><span> </span><span>2</span><span>):     </span><span># 回车默认</span></div></div><div><div><div>18</div></div><div><span>First</span><span> </span><span>sector:</span><span>                             </span><span># 回车默认</span></div></div><div><div><div>19</div></div><div><span>Last</span><span> </span><span>sector:</span><span> </span><span>+8G</span><span>                           </span><span># 8GB swap（按需调整）</span></div></div><div><div><div>20</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): t</span></div></div><div><div><div>21</div></div><div><span>Partition</span><span> </span><span>number:</span><span> </span><span>2</span></div></div><div><div><div>22</div></div><div><span>Hex</span><span> </span><span>code</span><span> </span><span>or</span><span> </span><span>alias:</span><span> </span><span>swap</span><span>                    </span><span># 或输入 8200</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span># === 创建根分区 ===</span></div></div><div><div><div>25</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): n</span></div></div><div><div><div>26</div></div><div><span>Partition</span><span> </span><span>number</span><span> (3-128, </span><span>default</span><span> </span><span>3</span><span>):     </span><span># 回车默认</span></div></div><div><div><div>27</div></div><div><span>First</span><span> </span><span>sector:</span><span>                             </span><span># 回车默认</span></div></div><div><div><div>28</div></div><div><span>Last</span><span> </span><span>sector:</span><span>                               </span><span># 回车，使用全部剩余空间</span></div></div><div><div><div>29</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): t</span></div></div><div><div><div>30</div></div><div><span>Partition</span><span> </span><span>number:</span><span> </span><span>3</span></div></div><div><div><div>31</div></div><div><span>Hex</span><span> </span><span>code</span><span> </span><span>or</span><span> </span><span>alias:</span><span> </span><span>linux-root</span><span>             </span><span># 或输入 8304</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span># === 保存写入 ===</span></div></div><div><div><div>34</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): p                    </span><span># 打印分区表确认</span></div></div><div><div><div>35</div></div><div><span>Command</span><span> (m </span><span>for</span><span> </span><span>help</span><span>): w                    </span><span># 写入磁盘并退出</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>3.3验证分区结果<a href="#33验证分区结果"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>lsblk</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 应该能看到类似这样的结果：</span></div></div><div><div><div>4</div></div><div><span>NAME</span><span>   </span><span>MAJ:MIN</span><span> </span><span>RM</span><span>   </span><span>SIZE</span><span> </span><span>RO</span><span> </span><span>TYPE</span><span> </span><span>MOUNTPOINTS</span></div></div><div><div><div>5</div></div><div><span>sda</span><span>      </span><span>8:0</span><span>    </span><span>0</span><span>    </span><span>60G</span><span>  </span><span>0</span><span> </span><span>disk</span></div></div><div><div><div>6</div></div><div><span>├─sda1</span><span>   </span><span>8:1</span><span>    </span><span>0</span><span>     </span><span>1G</span><span>  </span><span>0</span><span> </span><span>part</span><span>              </span><span>←</span><span> </span><span>EFI</span></div></div><div><div><div>7</div></div><div><span>├─sda2</span><span>   </span><span>8:2</span><span>    </span><span>0</span><span>     </span><span>8G</span><span>  </span><span>0</span><span> </span><span>part</span><span>              </span><span>←</span><span> </span><span>swap</span></div></div><div><div><div>8</div></div><div><span>└─sda3</span><span>   </span><span>8:3</span><span>    </span><span>0</span><span>    </span><span>51G</span><span>  </span><span>0</span><span> </span><span>part</span><span>              </span><span>←</span><span> </span><span>root</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="514" height="147" src="/_astro/Pasted%20image%2020260729233126.DARuFRXH_ZdpCci.webp" /></p></section></section><section><h2>4.格式化与挂载<a href="#4格式化与挂载"><span>#</span></a></h2><section><h3>4.1格式化分区<a href="#41格式化分区"><span>#</span></a></h3><p>分区创建完成后，需要为每个分区创建文件系统：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 格式化 EFI 分区为 FAT32</span></div></div><div><div><div>2</div></div><div><span>mkfs.fat</span><span> </span><span>-F</span><span> </span><span>32</span><span> </span><span>/dev/sdX1</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 格式化 swap 分区</span></div></div><div><div><div>5</div></div><div><span>mkswap</span><span> </span><span>/dev/sdX2</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 3. 格式化根分区为 ext4</span></div></div><div><div><div>8</div></div><div><span>mkfs.ext4</span><span> </span><span>/dev/sdX3</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>注意</div></div><div><p>如果磁盘上已有其他操作系统的 EFI 分区，<strong>不要重新格式化它</strong>，否则会破坏其他系统的引导。本教程假设是在全新磁盘上操作。</p></div></div><p><img alt="" loading="lazy" width="753" height="285" src="/_astro/Pasted%20image%2020260729233350.CTEMhk0Q_WjT0m.webp" /></p></section><section><h3>4.2挂载分区<a href="#42挂载分区"><span>#</span></a></h3><p>按照顺序挂载分区 — 先挂载根分区，再挂载 EFI 分区:</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 挂载根分区到 /mnt</span></div></div><div><div><div>2</div></div><div><span>mount</span><span> </span><span>/dev/sdX3</span><span> </span><span>/mnt</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 创建 boot 目录并挂载 EFI 分区</span></div></div><div><div><div>5</div></div><div><span>mount</span><span> </span><span>--mkdir</span><span> </span><span>/dev/sdX1</span><span> </span><span>/mnt/boot</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 3. 启用 swap</span></div></div><div><div><div>8</div></div><div><span>swapon</span><span> </span><span>/dev/sdX2</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 4. 验证挂载情况</span></div></div><div><div><div>11</div></div><div><span>lsblk</span><span> </span><span>-f</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1070" height="210" src="/_astro/Pasted%20image%2020260729233452.BbbZWIuR_2ic18Q.webp" /></p><div><div><div></div><div>挂载顺序很重要</div></div><div><p>必须先挂载根分区 <code>/mnt</code>，然后才能在其下创建 <code>/mnt/boot</code> 并挂载 EFI 分区。如果顺序反了，EFI 分区会被根分区的文件系统覆盖。</p></div></div></section></section><section><h2>5.安装基本系统<a href="#5安装基本系统"><span>#</span></a></h2><p>使用 <code>pacstrap</code> 脚本将基本系统安装到挂载的 <code>/mnt</code> 目录中。</p><section><h3>5.1更新软件源<a href="#51更新软件源"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pacman</span><span> </span><span>-Sy</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>5.2安装必须的软件包<a href="#52安装必须的软件包"><span>#</span></a></h3><p>必要的软件包列表，按需安装：</p>

<table><thead><tr><th>base</th><th>唯一的必需软件包</th></tr></thead><tbody><tr><td>linux</td><td>linux内核（<a href="https://link.zhihu.com/?target=https%3A//wiki.archlinuxcn.org/wiki/%25E5%2586%2585%25E6%25A0%25B8" target="_blank">https://wiki.archlinuxcn.org/wiki/%E5%86%85%E6%A0%B8</a>）依照链接介绍选择自己需要的linux内核进行安装</td></tr><tr><td>linux-firmware</td><td>固件</td></tr><tr><td>amd-ucode</td><td>用于硬件错误和安全修复（根据自己的处理器选择安装）</td></tr><tr><td>intel-ucode</td><td>用于硬件错误和安全修复（根据自己的处理器选择安装）</td></tr><tr><td>networkmanager</td><td>联网工具</td></tr><tr><td>neovim</td><td>命令行文本编辑器</td></tr><tr><td>sudo</td><td>sudo</td></tr><tr><td>使用如下命令安装：</td><td></td></tr></tbody></table><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pacstrap</span><span> </span><span>-K</span><span> </span><span>/mnt</span><span> </span><span>base</span><span> </span><span>linux</span><span> </span><span>linux-firmware</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260730113741.BTsq3HcH_Z6lY5i.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260730113753.9-iKCn-E_23Nn4v.webp" /></p></section><section><h3>5.3生成 fstab 文件<a href="#53生成-fstab-文件"><span>#</span></a></h3><p><code>fstab</code> 文件定义了系统启动时自动挂载的分区:</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用 UUID 生成 fstab</span></div></div><div><div><div>2</div></div><div><span>genfstab</span><span> </span><span>-U</span><span> </span><span>/mnt</span><span> &gt;&gt; </span><span>/mnt/etc/fstab</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 检查生成结果（应包含三个分区的信息）</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> </span><span>/mnt/etc/fstab</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>确认输出中包含根分区、EFI 分区和 swap 的条目。如果缺失，说明前面挂载步骤有问题。
<img alt="" loading="lazy" width="1277" height="238" src="/_astro/Pasted%20image%2020260730114148.CyAbbZjv_1zRecy.webp" /></p></section><section><h3>5.4进入 chroot 环境<a href="#54进入-chroot-环境"><span>#</span></a></h3><p><code>arch-chroot</code> 将你的根目录切换到新安装的系统中，后续所有命令都在新系统环境中执行:</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>arch-chroot</span><span> </span><span>/mnt</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 此后提示符会变化，表示你已进入新系统</span></div></div><div><div><div>4</div></div><div><span>[root@archiso /]#</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="322" height="41" src="/_astro/Pasted%20image%2020260730114239.Qw8TOXwN_Z2vTCrU.webp" /></p></section><section><h3>5.5设置时区<a href="#55设置时区"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 设置为上海时区（中国标准时间）</span></div></div><div><div><div>2</div></div><div><span>ln</span><span> </span><span>-sf</span><span> </span><span>/usr/share/zoneinfo/Asia/Shanghai</span><span> </span><span>/etc/localtime</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 同步硬件时钟到系统时钟</span></div></div><div><div><div>5</div></div><div><span>hwclock</span><span> </span><span>--systohc</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>5.6本地化设置<a href="#56本地化设置"><span>#</span></a></h3><p>设置系统语言和字符编码:</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1.安装nano</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>nano</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 编辑 locale.gen 文件</span></div></div><div><div><div>5</div></div><div><span>nano</span><span> </span><span>/etc/locale.gen</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 在文件中找到以下两行，去掉前面的 # 号取消注释：</span></div></div><div><div><div>8</div></div><div><span>en_US.UTF-8</span><span> </span><span>UTF-8</span></div></div><div><div><div>9</div></div><div><span>zh_CN.UTF-8</span><span> </span><span>UTF-8</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 3. 生成 locale</span></div></div><div><div><div>12</div></div><div><span>locale-gen</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 4. 设置系统语言（建议先用英文，避免终端乱码）</span></div></div><div><div><div>15</div></div><div><span>echo</span><span> </span><span>"LANG=en_US.UTF-8"</span><span> &gt; </span><span>/etc/locale.conf</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><div><div></div><div>为什么先用英文？</div></div><div><p>在纯命令行终端（TTY）中，中文字符无法正常显示，会出现乱码（方块/问号）。等安装好桌面环境和中文字体后，再改为 <code>zh_CN.UTF-8</code> 即可正常显示中文。</p></div></div></section><section><h3>5.7设置主机名<a href="#57设置主机名"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 设置你的电脑名称（自定义，例如 arch）</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"arch"</span><span> &gt; </span><span>/etc/hostname</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 编辑 hosts 文件</span></div></div><div><div><div>5</div></div><div><span>nano</span><span> </span><span>/etc/hosts</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在 <code>/etc/hosts</code> 文件中添加以下内容：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>127.0.0.1</span><span>   </span><span>localhost</span></div></div><div><div><div>2</div></div><div><span>:</span><span>:1</span><span>         </span><span>localhost</span></div></div><div><div><div>3</div></div><div><span>127.0.1.1</span><span>   </span><span>arch.localdomain</span><span>   </span><span>arch</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>（将 <code>arch</code> 替换为你设置的主机名）
<img alt="" loading="lazy" width="432" height="88" src="/_astro/Pasted%20image%2020260730121801.C6ul4cSp_Z1x3rSa.webp" /></p></section><section><h3>5.8设置 root 密码<a href="#58设置-root-密码"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>passwd</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>#New password:          # 输入密码（不会显示）</span></div></div><div><div><div>4</div></div><div><span>#Retype new password:    # 再次输入确认</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>5.9配置网络服务<a href="#59配置网络服务"><span>#</span></a></h3><p>启用 NetworkManager，确保安装后系统能自动联网:</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#安装NetworkManager</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>networkmanager</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启用 NetworkManager 开机自启</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>NetworkManager</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果不启用 NetworkManager，重启后系统将无法自动联网，你会被困在命令行中无法使用 Wi-Fi。这是新手最容易犯的错误之一。</p></section></section><section><h2>6.安装引导程序<a href="#6安装引导程序"><span>#</span></a></h2><p>引导程序（Bootloader）负责在开机时加载 Linux 内核。本教程使用 <strong>GRUB</strong>，这是最通用、文档最丰富的引导程序</p><section><h3>6.1安装 GRUB 和相关工具<a href="#61安装-grub-和相关工具"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 GRUB 和 EFI 引导管理器</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>grub</span><span> </span><span>efibootmgr</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>6.2安装 GRUB 到 EFI 分区<a href="#62安装-grub-到-efi-分区"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#安装efibootmgr</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>efibootmgr</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 将 GRUB 安装到 EFI 分区</span></div></div><div><div><div>5</div></div><div><span>grub-install</span><span> </span><span>--target=x86_64-efi</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>    </span><span>--efi-directory=/boot</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>    </span><span>--bootloader-id=GRUB</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 成功时会显示：Installation finished. No error reported.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>常见错误</div></div><div><p>如果报错 <code>efibootmgr: not found</code>，说明 <code>efibootmgr</code> 没装好，执行 <code>pacman -S efibootmgr</code> 安装。如果报 <code>EFI variables are not supported</code>，说明你实际上在 BIOS 模式下，需要重启检查 BIOS 设置。</p></div></div><p><img alt="" loading="lazy" width="515" height="102" src="/_astro/Pasted%20image%2020260730133818.TzS9ckpj_Wtb4j.webp" /></p></section><section><h3>6.3生成 GRUB 配置文件<a href="#63生成-grub-配置文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 自动生成 grub.cfg 配置文件</span></div></div><div><div><div>2</div></div><div><span>grub-mkconfig</span><span> </span><span>-o</span><span> </span><span>/boot/grub/grub.cfg</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>确认微码加载</div></div><div><p>输出中如果出现 <code>Found microcode image</code> 行，说明 CPU 微码已正确集成到引导配置中。如果没有，检查 <code>intel-ucode</code> 或 <code>amd-ucode</code> 是否已安装。</p></div></div><div><div><div></div><div>关于 <code>os-prober</code> 警告</div></div><div><p>如果你需要双系统（如 Windows），记得编辑 <code>/etc/default/grub</code>，加入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>GRUB_DISABLE_OS_PROBER</span><span>=</span><span>false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后安装 <code>os-prober</code> 包，再重新运行 <code>grub-mkconfig</code>。</p></div></div><p><img alt="" loading="lazy" width="689" height="150" src="/_astro/Pasted%20image%2020260730135003.GwE-LlF0_ZRJlOm.webp" /></p></section></section><section><h2>7.创建普通用户<a href="#7创建普通用户"><span>#</span></a></h2><p>日常使用不应直接使用 root 账户，需要创建一个普通用户并赋予 sudo 权限。</p><section><h3>7.1创建用户<a href="#71创建用户"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建用户（将 yourname 替换为你的用户名）</span></div></div><div><div><div>2</div></div><div><span>useradd</span><span> </span><span>-m</span><span> </span><span>-G</span><span> </span><span>wheel</span><span> </span><span>-s</span><span> </span><span>/bin/bash</span><span> </span><span>yourname</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 设置用户密码</span></div></div><div><div><div>5</div></div><div><span>passwd</span><span> </span><span>yourname</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>参数说明</div></div><div><ul>
<li><code>-m</code> — 创建用户主目录 <code>/home/yourname</code></li>
<li><code>-G wheel</code> — 将用户加入 wheel 组（sudo 权限组）</li>
<li><code>-s /bin/bash</code> — 设置默认 shell 为 bash</li>
</ul></div></div></section><section><h3>7.2配置 sudo 权限<a href="#72配置-sudo-权限"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 编辑 sudoers 文件（必须用 visudo！）</span></div></div><div><div><div>2</div></div><div><span>EDITOR</span><span>=</span><span>nano</span><span> </span><span>visudo</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 找到这一行，去掉前面的 # 号取消注释：</span></div></div><div><div><div>5</div></div><div><span># %wheel ALL=(ALL:ALL) ALL</span></div></div><div><div><div>6</div></div><div><span># 改为：</span></div></div><div><div><div>7</div></div><div><span>%wheel</span><span> </span><span>ALL=</span><span>(</span><span>ALL:ALL</span><span>) </span><span>ALL</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>务必使用 visudo</div></div><div><p>不要直接用 <code>nano /etc/sudoers</code> 编辑。<code>visudo</code> 会在保存时检查语法，防止配置错误导致 sudo 完全不可用。如果你设了 <code>EDITOR=nano</code>，它会用 nano 打开。</p></div></div><p><img alt="" loading="lazy" width="1317" height="844" src="/_astro/Pasted%20image%2020260730135717.ClClQmnb_Z13vhnc.webp" /></p></section><section><h3>7.3退出 chroot<a href="#73退出-chroot"><span>#</span></a></h3><p>如果你只想要命令行系统，现在可以跳到后文8.12部分的「退出 chroot 并重启」部分。但如果你要安装桌面环境，请继续在 chroot 环境中操作。</p></section></section><section><h2>8.安装桌面环境<a href="#8安装桌面环境"><span>#</span></a></h2><p>Arch Linux 默认只有命令行界面。要获得图形桌面，需要安装桌面环境（DE）和显示管理器（登录界面）。以下是几个主流选择：</p>

<table><thead><tr><th>桌面环境</th><th>特点</th><th>RAM 占用</th></tr></thead><tbody><tr><td>GNOME</td><td>现代简洁，开箱即用，Ubuntu/Fedora 默认桌面</td><td>~2 GB</td></tr><tr><td>KDE Plasma</td><td>功能丰富，高度可定制，Windows 风格</td><td>~1.5 GB</td></tr><tr><td>XFCE</td><td>轻量稳定，低资源占用，老电脑首选</td><td>~0.8 GB</td></tr><tr><td>Cinnamon</td><td>传统桌面布局，Linux Mint 风格</td><td>~1.2 GB</td></tr></tbody></table><div><div><div></div><div>如何选择？</div></div><div><ul>
<li><strong>新手推荐</strong>：KDE Plasma（界面类似 Windows，上手快）或 GNOME（简洁现代）</li>
<li><strong>低配电脑</strong>：XFCE（资源占用最低）</li>
<li><strong>喜欢传统桌面</strong>：Cinnamon（经典任务栏布局）</li>
</ul><p>你可以安装多个桌面环境，在登录界面切换。但建议初学者只装一个，避免配置冲突。</p></div></div><p>本文因在虚拟机内安装，所以选择XFCE。实际请根据自己的需求进行选择</p><section><h3>8.1安装 GNOME 桌面<a href="#81安装-gnome-桌面"><span>#</span></a></h3><p>GNOME 是最流行的现代 Linux 桌面环境之一，界面简洁，操作直观</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 GNOME 桌面环境 + 显示管理器 + 调整工具</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>gnome</span><span> </span><span>gnome-tweaks</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启用 GDM（GNOME 显示管理器）开机自启</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>gdm</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>GNOME 包说明</div></div><div><ul>
<li><code>gnome</code> — 包含 GNOME 桌面核心组件、GDM 显示管理器和常用应用</li>
<li><code>gnome-tweaks</code> — GNOME 调整工具，用于自定义主题、字体、扩展等</li>
</ul></div></div></section><section><h3>8.2安装 KDE Plasma 桌面<a href="#82安装-kde-plasma-桌面"><span>#</span></a></h3><p>KDE Plasma 功能强大且高度可定制，界面风格类似 Windows，新手容易上手</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 KDE Plasma 桌面 + SDDM 显示管理器 + 常用应用</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>plasma</span><span> </span><span>sddm</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>    </span><span>dolphin</span><span> </span><span>konsole</span><span> </span><span>kate</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>    </span><span>plasma-desktop</span><span> </span><span>plasma-nm</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 启用 SDDM 显示管理器</span></div></div><div><div><div>7</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>sddm</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>KDE 包说明</div></div><div><ul>
<li><code>plasma</code> — KDE Plasma 桌面元包</li>
<li><code>sddm</code> — 显示管理器（登录界面）</li>
<li><code>dolphin</code> — 文件管理器</li>
<li><code>konsole</code> — 终端模拟器</li>
<li><code>kate</code> — 文本编辑器</li>
<li><code>plasma-nm</code> — 网络管理小部件（Wi-Fi 管理）</li>
</ul></div></div></section><section><h3>8.3安装 XFCE 桌面<a href="#83安装-xfce-桌面"><span>#</span></a></h3><p>XFCE 是轻量级桌面环境，资源占用低，适合老旧硬件或追求性能的用户</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 XFCE + LightDM 显示管理器</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>xfce4</span><span> </span><span>xfce4-goodies</span><span> </span><span>lightdm</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>    </span><span>lightdm-gtk-greeter</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 启用 LightDM</span></div></div><div><div><div>6</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>lightdm</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>8.4安装 Cinnamon 桌面<a href="#84安装-cinnamon-桌面"><span>#</span></a></h3><p>Cinnamon 提供传统桌面布局，类似 Windows 的开始菜单和任务栏</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 Cinnamon + LightDM</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>cinnamon</span><span> </span><span>lightdm</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>    </span><span>lightdm-gtk-greeter</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 启用 LightDM</span></div></div><div><div><div>6</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>lightdm</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>8.5安装中文字体<a href="#85安装中文字体"><span>#</span></a></h3><p>安装桌面环境后，必须安装中文字体，否则中文会显示为方块/乱码：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装常用中文字体</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>noto-fonts-cjk</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>    </span><span>noto-fonts-emoji</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>    </span><span>wqy-microhei</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>    </span><span>wqy-zenhei</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>    </span><span>ttf-dejavu</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 安装完成后，将系统语言改为中文（可选）</span></div></div><div><div><div>9</div></div><div><span>echo</span><span> </span><span>"LANG=zh_CN.UTF-8"</span><span> &gt; </span><span>/etc/locale.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>8.6安装音频支持<a href="#86安装音频支持"><span>#</span></a></h3><p>现代 Linux 桌面使用 PipeWire 作为音频服务器：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 PipeWire 音频系统</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>pipewire</span><span> </span><span>pipewire-pulse</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>    </span><span>pipewire-alsa</span><span> </span><span>pipewire-jack</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>    </span><span>wireplumber</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># KDE 用户可额外安装音量控制小部件</span></div></div><div><div><div>7</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>plasma-pa</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># GNOME 用户无需额外安装，已内置🤔</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>8.7安装显卡驱动<a href="#87安装显卡驱动"><span>#</span></a></h3><p>根据你的显卡品牌安装对应驱动：</p>

<table><thead><tr><th>显卡品牌</th><th>驱动包</th><th>安装命令</th></tr></thead><tbody><tr><td>Intel 集成显卡</td><td>mesa</td><td><code>pacman -S mesa vulkan-intel</code></td></tr><tr><td>AMD 显卡</td><td>mesa</td><td><code>pacman -S mesa vulkan-radeon lib32-mesa lib32-vulkan-radeon</code></td></tr><tr><td>NVIDIA（新卡）</td><td>nvidia</td><td><code>pacman -S nvidia nvidia-utils</code></td></tr><tr><td>NVIDIA（老卡）</td><td>nvidia-470xx-dkms</td><td>从 AUR 安装</td></tr><tr><td>虚拟机</td><td>无需额外驱动(如果你是PVE等设备显卡直通了可以按照上方的安装对应驱动)</td><td>————</td></tr></tbody></table><div><div><div></div><div>NVIDIA 驱动注意事项</div></div><div><p>如果你使用 NVIDIA 显卡，安装驱动后还需要生成 initramfs。执行 <code>mkinitcpio -P</code> 重新生成。如果是双显卡笔记本，情况更复杂，请查阅 <a href="https://wiki.archlinux.org/title/NVIDIA" target="_blank">Arch Wiki NVIDIA</a> 页面。</p></div></div></section><section><h3>8.8启用 multilib 仓库（32位支持）<a href="#88启用-multilib-仓库32位支持"><span>#</span></a></h3><p>如果你需要运行 Steam 游戏或 Wine 等需要 32 位库的程序：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 编辑 pacman.conf</span></div></div><div><div><div>2</div></div><div><span>nano</span><span> </span><span>/etc/pacman.conf</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 找到以下两行，去掉前面的 # 号：</span></div></div><div><div><div>5</div></div><div><span>#[multilib]</span></div></div><div><div><div>6</div></div><div><span>#Include = /etc/pacman.d/mirrorlist</span></div></div><div><div><div>7</div></div><div><span># 改为：</span></div></div><div><div><div>8</div></div><div><span>[multilib]</span></div></div><div><div><div>9</div></div><div><span>Include</span><span> </span><span>=</span><span> </span><span>/etc/pacman.d/mirrorlist</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 更新包数据库</span></div></div><div><div><div>12</div></div><div><span>pacman</span><span> </span><span>-Sy</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>8.9安装 AUR 助手（推荐）<a href="#89安装-aur-助手推荐"><span>#</span></a></h3><p>AUR（Arch User Repository）包含大量官方仓库没有的软件。推荐安装 <code>yay</code> 作为 AUR 助手：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 先安装编译依赖</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>--needed</span><span> </span><span>base-devel</span><span> </span><span>git</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 切换到普通用户</span></div></div><div><div><div>5</div></div><div><span>su</span><span> </span><span>-</span><span> </span><span>yourname</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>#切换到有读写权限的目录</span></div></div><div><div><div>8</div></div><div><span>cd</span><span> </span><span>/home/yourname</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 下载并编译 yay</span></div></div><div><div><div>11</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://aur.archlinux.org/yay.git</span></div></div><div><div><div>12</div></div><div><span>cd</span><span> </span><span>yay</span></div></div><div><div><div>13</div></div><div><span>makepkg</span><span> </span><span>-si</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>yay 使用方法</div></div><div><p><code>yay</code> 的用法和 <code>pacman</code> 几乎一样，但它能自动从 AUR 下载、编译和安装软件。例如：<code>yay -S google-chrome</code>。</p></div></div></section><section><h3>8.10安装常用软件<a href="#810安装常用软件"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 浏览器</span></div></div><div><div><div>2</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>firefox</span><span> </span><span>firefox-i18n-zh-cn</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 办公套件</span></div></div><div><div><div>5</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>libreoffice-fresh</span><span> </span><span>libreoffice-fresh-zh-cn</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 输入法（Fcitx5 中文输入法）</span></div></div><div><div><div>8</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>fcitx5</span><span> </span><span>fcitx5-chinese-addons</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>    </span><span>fcitx5-configtool</span><span> </span><span>fcitx5-gtk</span><span> </span><span>fcitx5-qt</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 媒体播放</span></div></div><div><div><div>12</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>vlc</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 下载工具</span></div></div><div><div><div>15</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>wget</span><span> </span><span>curl</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>8.11配置中文输入法<a href="#811配置中文输入法"><span>#</span></a></h3><p>安装 Fcitx5 后，需要配置环境变量。编辑 <code>~/.bashrc</code>（bash）或 <code>~/.zshrc</code>（zsh）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 编辑用户配置文件</span></div></div><div><div><div>2</div></div><div><span>nano</span><span> </span><span>~/.bashrc</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 在文件末尾添加：</span></div></div><div><div><div>5</div></div><div><span>export</span><span> </span><span>GTK_IM_MODULE</span><span>=</span><span>fcitx</span></div></div><div><div><div>6</div></div><div><span>export</span><span> </span><span>QT_IM_MODULE</span><span>=</span><span>fcitx</span></div></div><div><div><div>7</div></div><div><span>export</span><span> </span><span>XMODIFIERS</span><span><span>=</span><span>@</span></span><span>im</span><span>=</span><span>fcitx</span></div></div><div><div><div>8</div></div><div><span>export</span><span> </span><span>SDL_IM_MODULE</span><span>=</span><span>fcitx</span></div></div><div><div><div>9</div></div><div><span>export</span><span> </span><span>GLFW_IM_MODULE</span><span>=</span><span>ibus</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在桌面环境的设置中，将 Fcitx5 添加到开机启动项。登录桌面后，按 <code>Ctrl + Space</code> 切换中英文输入。</p></section><section><h3>8.12退出并重启<a href="#812退出并重启"><span>#</span></a></h3><p>所有配置完成后，退出 chroot 并重启系统：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 退出 chroot</span></div></div><div><div><div>2</div></div><div><span>exit</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 卸载挂载的分区（可选但推荐）</span></div></div><div><div><div>5</div></div><div><span>umount</span><span> </span><span>-R</span><span> </span><span>/mnt</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 重启（记得拔掉 U 盘！）</span></div></div><div><div><div>8</div></div><div><span>reboot</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>重启前检查清单</div></div><div><ul>
<li>已安装引导程序（GRUB）并生成配置</li>
<li>已创建普通用户并配置 sudo</li>
<li>已启用 NetworkManager（<code>systemctl enable NetworkManager</code>）</li>
<li>已启用显示管理器（gdm / sddm / lightdm）</li>
<li>已安装中文字体</li>
<li>已设置 root 密码和用户密码</li>
</ul></div></div><p>重启后，你应该能看到显示管理器的登录界面。输入你的用户名和密码，就可以进入桌面环境了！🎉
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260730145314.CVQO-JqB_1hHzTB.webp" />
<img alt="" loading="lazy" width="1282" height="834" src="/_astro/Pasted%20image%2020260730152310.Du2TR7sr_ZGINCH.webp" /></p></section></section><section><h2>常见问题<a href="#常见问题"><span>#</span></a></h2><section><h3>Q1: 重启后进入 GRUB 命令行，没有菜单<a href="#q1-重启后进入-grub-命令行没有菜单"><span>#</span></a></h3><p>这通常是因为 GRUB 配置文件没有正确生成。你需要从 U 盘重新启动，挂载分区并 chroot 进去，重新执行：</p><p>修复 GRUB</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 从 U 盘启动后</span></div></div><div><div><div>2</div></div><div><span>mount</span><span> </span><span>/dev/sdX3</span><span> </span><span>/mnt</span></div></div><div><div><div>3</div></div><div><span>mount</span><span> </span><span>--mkdir</span><span> </span><span>/dev/sdX1</span><span> </span><span>/mnt/boot</span></div></div><div><div><div>4</div></div><div><span>arch-chroot</span><span> </span><span>/mnt</span></div></div><div><div><div>5</div></div><div><span>grub-mkconfig</span><span> </span><span>-o</span><span> </span><span>/boot/grub/grub.cfg</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Q2: 重启后没有网络 / Wi-Fi 不可用<a href="#q2-重启后没有网络--wi-fi-不可用"><span>#</span></a></h3><p>说明 NetworkManager 没有启用。从 U 盘启动后 chroot 进去：</p><p>修复网络</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>arch-chroot</span><span> </span><span>/mnt</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>NetworkManager</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Q3: 桌面环境启动后中文显示为方块<a href="#q3-桌面环境启动后中文显示为方块"><span>#</span></a></h3><p>缺少中文字体。在 TTY 或终端中执行：</p><p>安装中文字体</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>noto-fonts-cjk</span><span> </span><span>wqy-microhei</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Q4: 桌面登录后黑屏 / 无法进入桌面<a href="#q4-桌面登录后黑屏--无法进入桌面"><span>#</span></a></h3><p>可能是显卡驱动问题。尝试以下步骤：</p><ul>
<li>检查是否安装了正确的显卡驱动（参见 11.2 节）</li>
<li>NVIDIA 用户：确保安装了 <code>nvidia</code> 包并执行了 <code>mkinitcpio -P</code></li>
<li>尝试在 GRUB 启动菜单按 <code>e</code>，在内核参数中添加 <code>nomodeset</code> 临时禁用图形驱动</li>
</ul></section><section><h3>Q5: 安装过程中 pacman 报密钥错误<a href="#q5-安装过程中-pacman-报密钥错误"><span>#</span></a></h3><p>修复密钥</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 初始化 pacman 密钥环</span></div></div><div><div><div>2</div></div><div><span>pacman-key</span><span> </span><span>--init</span></div></div><div><div><div>3</div></div><div><span>pacman-key</span><span> </span><span>--populate</span><span> </span><span>archlinux</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 更新密钥环</span></div></div><div><div><div>6</div></div><div><span>pacman</span><span> </span><span>-Sy</span><span> </span><span>archlinux-keyring</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Q6: 如何在虚拟机中安装？<a href="#q6-如何在虚拟机中安装"><span>#</span></a></h3><p>虚拟机安装步骤基本相同，但需要注意：</p><ul>
<li>在虚拟机设置中选择 <strong>UEFI 引导模式</strong>（如果支持）</li>
<li>磁盘设备名可能是 <code>/dev/vda</code>（QEMU/KVM）或 <code>/dev/sda</code>（VirtualBox）</li>
</ul></section><section><h3>Q7: 如何启用中文 locale？<a href="#q7-如何启用中文-locale"><span>#</span></a></h3><p>安装好桌面和中文字体后，修改系统语言：</p><p>切换为中文</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 确认 locale.gen 中已取消注释 zh_CN.UTF-8</span></div></div><div><div><div>2</div></div><div><span>nano</span><span> </span><span>/etc/locale.gen</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>zh_CN.UTF-8</span><span> </span><span>UTF-8</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 重新生成 locale</span></div></div><div><div><div>7</div></div><div><span>locale-gen</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 设置中文</span></div></div><div><div><div>10</div></div><div><span>echo</span><span> </span><span>"LANG=zh_CN.UTF-8"</span><span> &gt; </span><span>/etc/locale.conf</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 重新登录或重启生效</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Q8: 日常维护建议<a href="#q8-日常维护建议"><span>#</span></a></h3><ul>
<li><strong>定期更新</strong>：执行 <code>sudo pacman -Syu</code> 保持系统最新</li>
<li><strong>更新前看新闻</strong>：访问 <a href="https://archlinux.org/" target="_blank">archlinux.org</a> 首页查看是否有需要手动干预的更新</li>
<li><strong>不要部分更新</strong>：不要只更新部分包，始终使用 <code>-Syu</code> 全量更新</li>
<li><strong>清理缓存</strong>：定期执行 <code>sudo pacman -Sc</code> 清理旧包缓存</li>
<li><strong>备份重要配置</strong>：备份 <code>/etc</code> 目录下的自定义配置文件</li>
</ul></section></section></section>
<section><h1>小结<a href="#小结"><span>#</span></a></h1><p>🎉 恭喜！
如果你顺利走到这一步，说明你已经成功安装了 Arch Linux 并配置好了桌面环境。Arch Linux 是一个滚动更新的发行版，你只需要定期执行 <code>sudo pacman -Syu</code> 就能保持系统永远是最新的。欢迎加入 Arch 社区！</p><p>参考文献：</p><ul>
<li><a href="https://wiki.archlinux.org/" target="_blank">ArchWiki</a></li>
<li><a href="bing.com">必应</a></li>
<li><a href="https://openai.com/" target="_blank">ChatGPT</a></li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/openlist/openlist-1/</id>
      <title type="text">Openlist美化指南</title>
      <published>2026-07-27T00:00:00.000Z</published>
      <updated>2026-07-27T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/openlist/openlist-1/"/>
      <summary type="text">为Openlist做美化</summary>
      <content type="html"><![CDATA[<section><h1>效果展示<a href="#效果展示"><span>#</span></a></h1><p><img alt="" loading="lazy" width="1600" height="793" src="/_astro/Pasted%20image%2020260727223611.CvZAY5da_7woRP.webp" />
<img alt="" loading="lazy" width="1600" height="793" src="/_astro/Pasted%20image%2020260727223626._8p1ic3k_Z17E1tQ.webp" />
<img alt="" loading="lazy" width="1600" height="793" src="/_astro/Pasted%20image%2020260727223919.DzvUC5u4_1GS1mL.webp" />
<img alt="" loading="lazy" width="1600" height="793" src="/_astro/Pasted%20image%2020260727224021.CFHhsvEO_1pLpDh.webp" /></p></section>
<section><h1>自定义头部<a href="#自定义头部"><span>#</span></a></h1><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!-- 引入 polyfill --&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"https://polyfill.alicdn.com/v3/polyfill.min.js?features=String.prototype.replaceAll"</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>&lt;!-- 引入字体 --&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>link</span><span> </span><span>rel</span><span>=</span><span>"stylesheet"</span><span> </span><span>href</span><span>=</span><span>"https://npm.elemecdn.com/lxgw-wenkai-webfont@1.1.0/lxgwwenkai-regular.css"</span><span> /&gt;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>/* 隐藏底部 */</span></div></div><div><div><div>9</div></div><div><span>    </span><span>.footer</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>display: </span><span>none</span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span>/* 背景设置 */</span></div></div><div><div><div>14</div></div><div><span>    </span><span>.hope-ui-dark</span><span><span>,</span><span> </span></span><span>.hope-ui-light</span><span> {</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>background-image: </span><span>url</span><span>(</span><span>'https://img.catcdn.cn/ba/'</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>background-size: </span><span>cover</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>background-attachment: </span><span>fixed</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>background-position: </span><span>center</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span>/*主列表白天模式透明*/</span></div></div><div><div><div>22</div></div><div><span>    </span><span>.obj-box.hope-stack.hope-c-dhzjXW.hope-c-PJLV.hope-c-PJLV-igScBhH-css</span><span> {</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>24</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.3</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>    </span><span>/*主列表夜间模式透明*/</span></div></div><div><div><div>29</div></div><div><span>    </span><span>.obj-box.hope-stack.hope-c-dhzjXW.hope-c-PJLV.hope-c-PJLV-iigjoxS-css</span><span> {</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>31</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.3</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>    </span><span>/*readme白天模式透明*/</span></div></div><div><div><div>36</div></div><div><span>    </span><span>.hope-c-PJLV.hope-c-PJLV-ikSuVsl-css</span><span> {</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>38</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.3</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>    </span><span>/*readme夜间模式透明*/</span></div></div><div><div><div>43</div></div><div><span>    </span><span>.hope-c-PJLV.hope-c-PJLV-iiuDLME-css</span><span> {</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>45</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.3</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>    </span><span>/*顶部*/</span></div></div><div><div><div>51</div></div><div><span>    </span><span>#root</span><span> </span><span>&gt;</span><span> </span><span>.header</span><span> {</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>53</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>background: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0</span><span>); </span><span>/* 透明背景色 */</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>56</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>    </span><span>/*导航条*/</span></div></div><div><div><div>59</div></div><div><span>    </span><span>/*白天模式*/</span></div></div><div><div><div>60</div></div><div><span>    </span><span>.hope-ui-light</span><span> </span><span>.body</span><span> </span><span>&gt;</span><span> </span><span>.nav</span><span> {</span></div></div><div><div><div>61</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.3</span><span>);</span></div></div><div><div><div>62</div></div><div><span><span>        </span></span><span>border-radius: </span><span>var</span><span>(</span><span>--hope-radii-xl</span><span>);</span></div></div><div><div><div>63</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>65</div></div><div><span>    </span><span>/*夜间模式*/</span></div></div><div><div><div>66</div></div><div><span>    </span><span>.hope-ui-dark</span><span> </span><span>.body</span><span> </span><span>&gt;</span><span> </span><span>.nav</span><span> {</span></div></div><div><div><div>67</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.3</span><span>);</span></div></div><div><div><div>68</div></div><div><span><span>        </span></span><span>border-radius: </span><span>var</span><span>(</span><span>--hope-radii-xl</span><span>);</span></div></div><div><div><div>69</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>70</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>71</div></div><div>
</div></div><div><div><div>72</div></div><div><span>    </span><span>/*隐藏导航条遮罩*/</span></div></div><div><div><div>73</div></div><div><span>    </span><span>.body</span><span> </span><span>&gt;</span><span> </span><span><span>.nav</span><span>::after</span></span><span> {</span></div></div><div><div><div>74</div></div><div><span><span>        </span></span><span>display: </span><span>none</span><span>;</span></div></div><div><div><div>75</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>76</div></div><div>
</div></div><div><div><div>77</div></div><div><span>    </span><span>/*右上视图切换菜单*/</span></div></div><div><div><div>78</div></div><div><span>    </span><span>/*白天模式*/</span></div></div><div><div><div>79</div></div><div><span>    </span><span>.hope-ui-light</span><span> </span><span>.hope-c-PJLV-iSMXDf-css</span><span> {</span></div></div><div><div><div>80</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>81</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>82</div></div><div><span><span>        </span></span><span>background: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.3</span><span>); </span><span>/* 透明背景色 */</span></div></div><div><div><div>83</div></div><div><span><span>        </span></span><span>border-radius: </span><span><span>10</span><span>px</span></span><span>;</span></div></div><div><div><div>84</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>85</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>86</div></div><div><span>    </span><span>/*夜间模式*/</span></div></div><div><div><div>87</div></div><div><span>    </span><span>.hope-ui-dark</span><span> </span><span>.hope-c-PJLV-iSMXDf-css</span><span> {</span></div></div><div><div><div>88</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>89</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>90</div></div><div><span><span>        </span></span><span>background: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.3</span><span>); </span><span>/* 透明背景色 */</span></div></div><div><div><div>91</div></div><div><span><span>        </span></span><span>border-radius: </span><span>var</span><span>(</span><span>--hope-radii-xl</span><span>);</span></div></div><div><div><div>92</div></div><div><span><span>        </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>6</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>); </span><span>/* 阴影效果 */</span></div></div><div><div><div>93</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>94</div></div><div>
</div></div><div><div><div>95</div></div><div><span>    </span><span>/*右下角侧边栏按钮透明 第一个是白天 第二个是夜间*/</span></div></div><div><div><div>96</div></div><div><span>    </span><span>.hope-ui-light</span><span> </span><span>.hope-c-PJLV-ijgzmFG-css</span><span> {</span></div></div><div><div><div>97</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>98</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>99</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.3</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>100</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>101</div></div><div><span>    </span><span>.hope-ui-dark</span><span> </span><span>.hope-c-PJLV-ijgzmFG-css</span><span> {</span></div></div><div><div><div>102</div></div><div><span><span>        </span></span><span>backdrop-filter: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 毛玻璃效果的强度 */</span></div></div><div><div><div>103</div></div><div><span>        </span><span>-webkit-backdrop-filter</span><span>: </span><span>blur</span><span>(</span><span><span>10</span><span>px</span></span><span>); </span><span>/* 为 Safari 浏览器添加兼容性 */</span></div></div><div><div><div>104</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.5</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>105</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>106</div></div><div><span>    </span><span>/*白天模式代码块透明*/</span></div></div><div><div><div>107</div></div><div><span>    </span><span>.hope-ui-light</span><span> </span><span>pre</span><span> {</span></div></div><div><div><div>108</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0.1</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>109</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>110</div></div><div><span>    </span><span>/*夜间模式代码块透明*/</span></div></div><div><div><div>111</div></div><div><span>    </span><span>.hope-ui-dark</span><span> </span><span>pre</span><span> {</span></div></div><div><div><div>112</div></div><div><span><span>        </span></span><span>background-color: </span><span>rgba</span><span>(</span><span>255</span><span>, </span><span>255</span><span>, </span><span>255</span><span>, </span><span>0</span><span>) </span><span>!important</span><span>;</span></div></div><div><div><div>113</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>114</div></div><div>
</div></div><div><div><div>115</div></div><div><span>    </span><span>/*底部CSS，.App .table这三个一起的*/</span></div></div><div><div><div>116</div></div><div><span>    </span><span>dibu</span><span> {</span></div></div><div><div><div>117</div></div><div><span><span>        </span></span><span>border-top: </span><span><span>0</span><span>px</span></span><span>;</span></div></div><div><div><div>118</div></div><div><span><span>        </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>119</div></div><div><span><span>        </span></span><span>bottom: </span><span>0</span><span>;</span></div></div><div><div><div>120</div></div><div><span><span>        </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>121</div></div><div><span><span>        </span></span><span>margin: </span><span><span>0</span><span>px</span></span><span>;</span></div></div><div><div><div>122</div></div><div><span><span>        </span></span><span>padding: </span><span><span>0</span><span>px</span></span><span>;</span></div></div><div><div><div>123</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>124</div></div><div><span>    </span><span>.App</span><span> {</span></div></div><div><div><div>125</div></div><div><span><span>        </span></span><span>min-height: </span><span><span>85</span><span>vh</span></span><span>;</span></div></div><div><div><div>126</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>127</div></div><div><span>    </span><span>.table</span><span> {</span></div></div><div><div><div>128</div></div><div><span><span>        </span></span><span>margin: </span><span>auto</span><span>;</span></div></div><div><div><div>129</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>130</div></div><div>
</div></div><div><div><div>131</div></div><div>
</div></div><div><div><div>132</div></div><div><span>    </span><span>/*全局字体*/</span></div></div><div><div><div>133</div></div><div><span>    </span><span>*</span><span> {</span></div></div><div><div><div>134</div></div><div><span><span>        </span></span><span>font-family: LXGW WenKai;</span></div></div><div><div><div>135</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>136</div></div><div><span>    </span><span>*</span><span> {</span></div></div><div><div><div>137</div></div><div><span><span>        </span></span><span>font-weight: </span><span>bold</span><span>;</span></div></div><div><div><div>138</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>139</div></div><div><span>    </span><span>body</span><span> {</span></div></div><div><div><div>140</div></div><div><span><span>        </span></span><span>font-family: LXGW WenKai;</span></div></div><div><div><div>141</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>142</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h1>自定义内容<a href="#自定义内容"><span>#</span></a></h1><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!-- 延迟加载 --&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"customize"</span><span> </span><span>style</span><span>=</span><span>"</span><span>display: none;</span><span>"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>br</span><span> /&gt;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>&lt;</span><span>center</span><span> </span><span>class</span><span>=</span><span>"dibu"</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>style</span><span>=</span><span>"</span><span> line-height: 20px;font-size: 9pt;font-weight: bold;</span><span>"</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>&lt;</span><span>span</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>                    </span></span><span>"</span></div></div><div><div><div>9</div></div><div><span><span>                    </span></span><span>&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color: rgb(15, 175, 255); font-weight: bold;</span><span>"</span><span> </span><span>id</span><span>=</span><span>"hitokoto"</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>                        </span></span><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"#"</span><span> </span><span>id</span><span>=</span><span>"hitokoto_text"</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>                            </span></span><span>"与你的日常，便是奇迹！"</span></div></div><div><div><div>12</div></div><div><span><span>                        </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>&lt;/</span><span>span</span><span>&gt; "</span></div></div><div><div><div>14</div></div><div><span><span>                </span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>            </span><span>&lt;!-- 底部链接 --&gt;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>style</span><span>=</span><span>"</span><span>font-size: 13px; font-weight: bold;</span><span>"</span><span>&gt;</span></div></div><div><div><div>19</div></div><div><span><span>                </span></span><span>&lt;</span><span>span</span><span> </span><span>class</span><span>=</span><span>"nav-item"</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span><span>                    </span></span><span>&lt;</span><span>a</span><span> </span><span>class</span><span>=</span><span>"nav-link"</span><span> </span><span>href</span><span>=</span><span>"https://jerrytom0401@163.com"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span><span>                        </span></span><span>&lt;</span><span>i</span><span> </span><span>class</span><span>=</span><span>"fa-duotone fa-envelope-open"</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:#409EFF</span><span>"</span><span> </span><span>aria-hidden</span><span>=</span><span>"true"</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span><span>                        </span></span><span>&lt;/</span><span>i</span><span>&gt;</span></div></div><div><div><div>23</div></div><div><span><span>                        </span></span><span>邮箱 |</span></div></div><div><div><div>24</div></div><div><span><span>                    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span><span>                </span></span><span>&lt;</span><span>span</span><span> </span><span>class</span><span>=</span><span>"nav-item"</span><span>&gt;</span></div></div><div><div><div>27</div></div><div><span><span>                    </span></span><span>&lt;</span><span>a</span><span> </span><span>class</span><span>=</span><span>"nav-link"</span><span> </span><span>href</span><span>=</span><span>"https://www.jerry-nis.top/"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span>&gt;</span></div></div><div><div><div>28</div></div><div><span><span>                        </span></span><span>&lt;</span><span>i</span><span> </span><span>class</span><span>=</span><span>"fas fa-edit"</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:#409EFF</span><span>"</span><span> </span><span>aria-hidden</span><span>=</span><span>"true"</span><span>&gt;</span></div></div><div><div><div>29</div></div><div><span><span>                        </span></span><span>&lt;/</span><span>i</span><span>&gt;</span></div></div><div><div><div>30</div></div><div><span><span>                        </span></span><span>博客 |</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>33</div></div><div><span>                </span><span>&lt;!--后台入口--&gt;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>&lt;</span><span>span</span><span> </span><span>class</span><span>=</span><span>"nav-item"</span><span>&gt;</span></div></div><div><div><div>35</div></div><div><span><span>                    </span></span><span>&lt;</span><span>a</span><span> </span><span>class</span><span>=</span><span>"nav-link"</span><span> </span><span>href</span><span>=</span><span>"/@manage"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span>&gt;</span></div></div><div><div><div>36</div></div><div><span><span>                        </span></span><span>&lt;</span><span>i</span><span> </span><span>class</span><span>=</span><span>"fa-solid fa-folder-gear"</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:#409EFF;</span><span>"</span><span> </span><span>aria-hidden</span><span>=</span><span>"true"</span><span>&gt;</span></div></div><div><div><div>37</div></div><div><span><span>                        </span></span><span>&lt;/</span><span>i</span><span>&gt;</span></div></div><div><div><div>38</div></div><div><span><span>                        </span></span><span>管理 |</span></div></div><div><div><div>39</div></div><div><span><span>                    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>40</div></div><div><span><span>                </span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>41</div></div><div><span>                </span><span>&lt;!--版权，请尊重作者--&gt;</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>&lt;</span><span>span</span><span> </span><span>class</span><span>=</span><span>"nav-item"</span><span>&gt;</span></div></div><div><div><div>43</div></div><div><span><span>                    </span></span><span>&lt;</span><span>a</span><span> </span><span>class</span><span>=</span><span>"nav-link"</span><span> </span><span>href</span><span>=</span><span>"https://github.com/Xhofe/alist"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span>&gt;</span></div></div><div><div><div>44</div></div><div><span><span>                        </span></span><span>&lt;</span><span>i</span><span> </span><span>class</span><span>=</span><span>"fa-solid fa-copyright"</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:#409EFF;</span><span>"</span><span> </span><span>aria-hidden</span><span>=</span><span>"true"</span><span>&gt;</span></div></div><div><div><div>45</div></div><div><span><span>                        </span></span><span>&lt;/</span><span>i</span><span>&gt;</span></div></div><div><div><div>46</div></div><div><span><span>                        </span></span><span>Openlist</span></div></div><div><div><div>47</div></div><div><span><span>                    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>48</div></div><div><span><span>                </span></span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>49</div></div><div><span><span>            </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>&lt;/</span><span>center</span><span>&gt;</span></div></div><div><div><div>51</div></div><div><span><span>        </span></span><span>&lt;</span><span>br</span><span> /&gt;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>    </span><span>&lt;!--一言API--&gt;</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"https://v1.hitokoto.cn/?encode=js&amp;select=%23hitokoto"</span><span> </span><span>defer</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>56</div></div><div><span>&lt;!--延迟加载范围到这里结束--&gt;</span></div></div><div><div><div>57</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>&lt;!-- 延迟加载JS --&gt;</span></div></div><div><div><div>60</div></div><div><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>61</div></div><div><span>    </span><span>let</span><span><span> </span><span>interval</span><span> </span></span><span>=</span><span> </span><span>setInterval</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>62</div></div><div><span>        </span><span>if</span><span><span> (</span><span>document</span><span>.</span></span><span>querySelector</span><span>(</span><span>".footer"</span><span>)) {</span></div></div><div><div><div>63</div></div><div><span><span>            </span></span><span>document</span><span>.</span><span>querySelector</span><span>(</span><span>"#customize"</span><span>).</span><span>style</span><span>.</span><span>display</span><span> </span><span>=</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>64</div></div><div><span>            </span><span>clearInterval</span><span><span>(</span><span>interval</span><span>);</span></span></div></div><div><div><div>65</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>}, </span><span>200</span><span>);</span></div></div><div><div><div>67</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/openfg/openfg/</id>
      <title type="text">OpenFG插帧补帧软件使用指南</title>
      <published>2026-07-24T00:00:00.000Z</published>
      <updated>2026-07-24T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/openfg/openfg/"/>
      <summary type="text">OpenFG是一个新出的补帧工具，利用Root进行更底层的插帧操作。本文讲述了安装方法以及体验。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>有时候我们在爽完游戏的时候，明明手机有120、144高刷，但是游戏却不支持，该怎么办呢😭</p><p>有时候我们在爽完游戏的时候，手机性能跟不上，开60刷新率就掉帧，该怎么办呢😭</p><p>厂商云控温控发力，游戏锁帧，功率过高，该怎么解决呢😭</p><p>插帧工具能给你一个比较完美的选择(性能过低的设备不建议启用插帧功能，会加剧卡顿)。</p><p>目前主流的插帧软件有NeoM
irror、AVU、VSCO、NV、Blurrr-AMV、timefreeze、timeCut、AE动效忍者等，本文介绍的是最近新出的一款插帧软件。它依赖于模块和Root，理论兼容性等效果更佳。</p><p>截止到本文发布OpenFG版本为1.0.0。</p><div><div><div></div><div>警告</div></div><div><p>本教程仅适用于已解BL锁已Root的设备
在操作前请确保你的数据已备份或拥有救机的能力，否则后果自负！</p></div></div></section>
<section><h1>操作步骤<a href="#操作步骤"><span>#</span></a></h1><section><h3>基础<a href="#基础"><span>#</span></a></h3><ol>
<li>前往<a href="https://github.com/OpenFGG/openfg-app" target="_blank">Github仓库</a>下载模块以及应用，安装本体并给予本体Root权限。</li>
<li>在你的Root管理器安装模块并重启(需有前置Zygisk，magisk可在设置中开启，kernelsu等管理器可安装zygisk next模块)</li>
<li>打开软件，通过引导页。(若发现进入首页只有一个OpenFG或者没有应用请手动到系统设置里给予OpenFG应用获取权限)</li>
<li>打开应用，点击左上角扳手图标，检查配置是否全部可用，若有异常可自行AI解决<img alt="" loading="lazy" width="417" height="890" src="/_astro/Pasted%20image%2020260724181103.DqPJp3PO_dhq8x.webp" /><img alt="" loading="lazy" width="413" height="901" src="/_astro/Pasted%20image%2020260724181135.C1I9JHeH_Z2pNh8n.webp" /></li>
<li>勾选你需要插帧/补帧的游戏或应用，并点击打开配置</li>
</ol></section><section><h3>如何配置<a href="#如何配置"><span>#</span></a></h3><ol>
<li>Enable OpenFG：（顾名思义开启openfg，关了就不插帧）</li>
<li>Show floating menu：是否在左上角显示帧率信息[实际帧率/插帧后帧率]</li>
<li>Frame generation：</li>
</ol><ul>
<li>Multiplier：倍率插帧，插帧后帧率为实际帧率的倍数。</li>
<li>Target FPS：固定目标帧率</li>
</ul><div><div><div></div><div>提示</div></div><div><p>二者只有一个生效。</p></div></div><ol>
<li>Activation floor：在帧率低于设定的帧率后进行插帧</li>
<li>Flow:</li>
</ol><ul>
<li>Engine ：游戏选择Hardware，性能最优；视频选择Video。</li>
<li>Flow scale：插针分辨率，越低画面越模糊。</li>
<li>Upscaler：缩放算法；FSR1画面表现效果最佳，高通机型推荐SGSR。</li>
<li>Sharpness：锐度调整。</li>
</ul><ol>
<li>HDR：</li>
</ol><ul>
<li>Brightness（亮度滑块）</li>
<li>Highlight boost（高光增强滑块）</li>
<li>Shadow depth（阴影深度滑块）</li>
<li>Contrast（对比度滑块）</li>
<li>Saturation（饱和度滑块）</li>
</ul><ol>
<li>Graphics API：图形接口，OpenGL兼容性最佳，Vulkan性能最佳。</li>
<li>Alternative VK Capture&lt;解决悬浮窗黑屏&gt;、只捕获 UI 菜单、无画面的问题；开启后会强制 API 切换为 Vulkan。</li>
<li>Video playback FG&lt;在给视频播放软件插帧时需开启&gt;，游戏需关闭。
<img alt="" loading="lazy" width="311" height="1600" src="/_astro/Screenshot_20260724-180731_OpenFG.DVATqh4R_1OtvoD.webp" /></li>
</ol><p>感谢你的阅读，希望你能收获新的知识。
参考文献：</p><ul>
<li><a href="https://github.com/OpenFGG/openfg-app" target="_blank">OpenFGG/openfg-app：用于安卓游戏的插值帧生成</a></li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/notion-blog/notion-blog/</id>
      <title type="text">NotionNext免费搭建博客指南</title>
      <published>2026-07-20T00:00:00.000Z</published>
      <updated>2026-07-20T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/notion-blog/notion-blog/"/>
      <summary type="text">本文介绍了Notion软件的使用方法以及利用NotionNext和Vercel平台搭建自己的博客，实现更简单的编写博客方式。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><section><h3>Notion是什么<a href="#notion是什么"><span>#</span></a></h3><p>Notion是一款一体化模块化数字工作台，以积木式区块为核心，整合笔记、文档、数据库、看板等功能，搭配双向链接、原生AI与海量模板，无需代码就能搭建知识库、任务系统与个人主页，支持多端同步和团队协作，是适合博主记录素材、整理文稿、搭建内容库的全能工具。作为博客编辑器非常方便便利。</p></section><section><h3>NotionNext是什么<a href="#notionnext是什么"><span>#</span></a></h3><p>NotionNext基于<strong>Next.js</strong>开发的将Notion笔记转为静态博客网页的开源项目，它可以帮助你<strong>免费</strong>的搭建自己的网站，让别人了解你的想法。</p></section><section><h3>博客优势与缺点<a href="#博客优势与缺点"><span>#</span></a></h3><div>
<table>
  <colgroup><col />
  <col />
  <col />
  <col />
  <col />
  <col />
  <col />
  </colgroup><tbody><tr>
    <th></th>
    <th>NotionNext</th>
    <th>Hexo</th>
    <th>Hugo</th>
    <th>Wordpress</th>
    <th>Astro</th>
    <th>Halo</th>
  </tr>
  <tr>
    <td><strong>优势</strong></td>
    <td>专门面向独立博客 / 资讯站，开箱即用完整博客系统，无需从零搭框架。内置管理面板，不用本地写 md，网页端直接发文。对国内服务器、CDN、图床兼容性更好。基础功能全部集成，不用额外装插件。一站式编辑，小白上手难度低。</td>
    <td>轻量极速，纯静态页面访问速度快。中文主题生态完善，大量国人制作精美主题。上手难度适中，Markdown写作简单，支持免费静态部署，无服务器开销。</td>
    <td>Go语言构建速度极强，千篇文章毫秒生成；原生图片压缩、多语言、搜索、分页；资源占用极低；支持多种文档格式。</td>
    <td>生态极其丰富，海量主题插件；可视化后台零代码操作；建站全场景适配，托管一键安装。</td>
    <td>混合SSG/SSR渲染，默认零JS页面极速；可混用Svelte/Vue/React组件；内置图片优化、RSS、Sitemap；全平台免费静态部署。</td>
    <td>国产可视化后台，网页端直接发文；中文主题插件生态完善；Docker一键部署；性能优于WordPress，社区持续更新维护。</td>
  </tr>
  <tr>
    <td><strong>缺点</strong></td>
    <td>主题、插件数量远不如 WP、Hexo、Astro，自定义空间小，修改主题繁琐。基于自研架构，深度二次开发门槛高。免费部署支持性差。</td>
    <td>文章百篇以上构建速度变慢；无原生后台，评论、统计等功能需对接第三方；本地dev预览刷新慢；插件体系老旧，核心更新缓慢。</td>
    <td>Go模板语法晦涩，上手门槛高；中文主题稀缺；插件生态薄弱；热重载调试体验一般；动态功能全部依赖第三方。</td>
    <td>PHP+数据库动态架构，高并发卡顿；代码冗余臃肿；插件漏洞多、安全风险高；长期使用需要付费服务器维持。</td>
    <td>成熟主题偏少；大版本更新易出现依赖兼容报错；无可视化后台，纯小白发文门槛高；SSR部署需要额外适配。</td>
    <td>依赖Java运行环境，低配服务器内存占用高；无法零成本静态托管；主题自研模板引擎，前端自定义改造限制大。</td>
  </tr>
</tbody></table>
</div></section></section>
<section><h1>操作步骤<a href="#操作步骤"><span>#</span></a></h1><section><h3>创建Notion页面<a href="#创建notion页面"><span>#</span></a></h3><ol>
<li>前往<a href="https://www.notion.so/" target="_blank">Notion</a>注册并登录账号。</li>
<li>打开<a href="https://tanghh.notion.site/02ab3b8678004aa69e9e415905ef32a5" target="_blank">Notion 博客模板</a>并点击右上角的复制按钮将模板复制到自己的Notion<img alt="" loading="lazy" width="1600" height="800" src="/_astro/Pasted%20image%2020260720230805.BSOX0u59_Z2jphVf.webp" />点击添加到私人空间<img alt="" loading="lazy" width="432" height="268" src="/_astro/Pasted%20image%2020260720230844.BkKpBybD_ZYf2n2.webp" /></li>
</ol></section><section><h3>获取页面ID<a href="#获取页面id"><span>#</span></a></h3><p>点击进入模板
<img alt="" loading="lazy" width="278" height="177" src="/_astro/Pasted%20image%2020260720231135.BzBXLubE_1eDY8R.webp" />
点击页面右上角的<strong>共享-发布-发布</strong>，获得网页地址
<img alt="" loading="lazy" width="1600" height="904" src="/_astro/Pasted%20image%2020260720231242.BGXLm0ad_ZDRNjb.webp" />
<img alt="" loading="lazy" width="453" height="381" src="/_astro/Pasted%20image%2020260720231302.ZlUXayJg_Z1B4Sr4.webp" /></p><p>点击查看网站，进入到创建的页面中。复制地址栏的地址，其中<code>/</code>后，<code>?</code>前的字符串的为页面ID
例:[<a href="https://autumn-aurora-837.notion.site/52e7398bf7298236937a012188707812?v=f7f7398bf729831cb466087545e80d5c" target="_blank">https://autumn-aurora-837.notion.site/52e7398bf7298236937a012188707812?v=f7f7398bf729831cb466087545e80d5c</a> 中，52e7398bf7298236937a012188707812为我的页面ID</p></section><section><h3>部署<a href="#部署"><span>#</span></a></h3><section><h4>仓库配置<a href="#仓库配置"><span>#</span></a></h4><ol>
<li>注册Github(此处不再赘述)</li>
<li>点击<a href="https://github.com/tangly1024/NotionNext/fork" target="_blank">Fork项目</a>一键Fork项目到自己的仓库</li>
</ol></section><section><h4>Vercel部署<a href="#vercel部署"><span>#</span></a></h4><ol>
<li>注册Vercel账号并连接到Github(此处不再赘述)</li>
<li>点击<a href="https://vercel.com/new" target="_blank">New Project</a>新建项目，并导入刚刚Fork的仓库<img alt="" loading="lazy" width="917" height="349" src="/_astro/Pasted%20image%2020260720232100.CDyJ71tl_1zQFvs.webp" /></li>
<li>配置环境变量：点击<strong>Environment Variables</strong>，添加一个属性名称为<code>NOTION_PAGE_ID</code>，值为刚刚获取的<strong>页面ID</strong>。<img alt="" loading="lazy" width="760" height="667" src="/_astro/Pasted%20image%2020260720232242.D1Ghni4J_1yis9Q.webp" /></li>
<li>点击Deploy进行部署，等待几分钟即可部署完成😋<img alt="" loading="lazy" width="1912" height="956" src="/_astro/Pasted%20image%2020260721115757.CJ4g0FkC_14OkkQ.webp" /></li>
</ol></section><section><h4>添加域名<a href="#添加域名"><span>#</span></a></h4><ol>
<li>部署完成后点击下面的Add Domain<img alt="" loading="lazy" width="1453" height="751" src="/_astro/Pasted%20image%2020260721115843.y_-9navx_2rC8vS.webp" /></li>
<li>点击Add Existing<img alt="" loading="lazy" width="545" height="611" src="/_astro/Pasted%20image%2020260721120252.BdDfgZZf_Z1Ts1r.webp" /></li>
<li>前往自己的域名DNS编辑，添加你填写的域名的CNAME解析<img alt="" loading="lazy" width="1570" height="351" src="/_astro/Pasted%20image%2020260721120337.DavUU07X_Z19muqb.webp" /><img alt="" loading="lazy" width="766" height="381" src="/_astro/Pasted%20image%2020260721120436.wR7NYt--_Z2rpnOF.webp" /></li>
<li>回到vercel，刷新并等待一会后就添加完成了<img alt="" loading="lazy" width="1575" height="63" src="/_astro/Pasted%20image%2020260721120509.W3ogIDYc_J6oOu.webp" /></li>
</ol></section></section></section>
<section><h1>小结<a href="#小结"><span>#</span></a></h1><p>在部署完成后，你可以前往Notion个人工作空间-Notion博客页配置你的网站、写发文章了。
可以根据<a href="https://notionnext.tangly1024.com/" target="_blank">NotionNext 使用说明</a>进行个性化设置以及文章编写
<img alt="" loading="lazy" width="1600" height="800" src="/_astro/Pasted%20image%2020260721121505.CS6r-I-Z_Z1KYdAY.webp" />
<img alt="" loading="lazy" width="1600" height="838" src="/_astro/Pasted%20image%2020260721121724.X3KP44nB_Z1VFbwg.webp" /></p><p>参考文献：</p><ol>
<li><a href="https://docs.tangly1024.com/about" target="_blank">NotionNext-快速免费建站 | Notion开源、免费、快速建站</a></li>
<li><a href="https://notionnext.tangly1024.com/" target="_blank">NotionNext 使用说明</a></li>
<li><a href="https://tanghh.notion.site/Notion-cb321d270b454a56bfa3a7199001daf9" target="_blank">Notion进阶教程</a></li>
</ol></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/aosp/aosp/</id>
      <title type="text">安卓类原生刷入指南</title>
      <published>2026-07-19T00:00:00.000Z</published>
      <updated>2026-07-19T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/aosp/aosp/"/>
      <summary type="text">为你的安卓手机刷入AOSP类原生，体验原生安卓的功能。本文以红米K60，lunarisAOSP为示例，实际大部分类原生都可使用此方法刷入。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><div><div><div></div><div>提示 &gt; 本教程仅适用于已解锁Bootloader的安卓设备！</div></div><div></div></div><div><div><div></div><div>警告 &gt; 搞机有风险，刷机需谨慎！请注意备份自己的数据，出现问题概不负责！刷入后设备原有数据将会被彻底清除，注意备份数据！！</div></div><div></div></div><p>你是否已经厌倦自己手机厂商的定制系统？想要体验新的UI以及不同的功能？</p><p>AOSP类原生项目为你提供了一个很好的选择！</p><p>目前主流的类原生项目有LineageOS、Crdroid、Evolution X、RisingOS、Pixel Experience等
，你可以前往对应的下载站下载卡刷压缩包进行刷机操作。</p><p>本文以红米K60为例，刷入LunarisAOSP，并记录其过程。</p></section>
<section><h1>操作步骤<a href="#操作步骤"><span>#</span></a></h1><section><h3>获取工具<a href="#获取工具"><span>#</span></a></h3><p>前往<a href="https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn" target="_blank">Android Developers</a>下载自己设备适用的ADB工具，并解压的空闲目录备用（此处使用windows版）
<em><strong>windows设备部分版本windows需装adb驱动，前往<a href="https://lsdy.top/azqd" target="_blank">一键安装安卓驱动-官网</a>下载并安装驱动即可</strong></em></p></section><section><h3>获取卡刷包<a href="#获取卡刷包"><span>#</span></a></h3><p>前往类原生项目的下载站获取卡刷包</p><p>例如此处mondrian机型Lunaris 3.12卡刷包地址为<a href="https://artifacts.serverhive.in/?id=lunaris-aosp-mondrian-20260715-104922099074" target="_blank">Artifact Explorer</a></p><p>若有Partition Images下载，下载下来<strong>recovery.img、<br />
vbmeta.img</strong>这四个文件备用。</p><p>若无这些镜像，可以从卡刷包中提取(根目录若没有的话，则可以从payload.bin中提取)</p></section><section><h3>刷入恢复分区(Recovery)<a href="#刷入恢复分区recovery"><span>#</span></a></h3><p>将手机关机，按下<strong>开机键+音量减键</strong>进入FastBoot模式，并将数据线插入手机</p><p>在你解压ADB工具的根目录下(有.exe文件的目录)，在地址栏输入cmd打开命令提示符
<img alt="" loading="lazy" width="849" height="477" src="/_astro/Pasted%20image%2020260719183635.DV8EGfu8_1X0zVF.webp" /></p><p>输入<code>fastboot devices</code></p><p>若一切正常，应输出你的设备id：
<img alt="" loading="lazy" width="574" height="66" src="/_astro/Pasted%20image%2020260719190933.bMpyZzX1_Z17P59V.webp" /></p><p>依次输入以下的指令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>##刷入镜像</span></div></div><div><div><div>2</div></div><div><span>fastboot flash recovery 你的recovery.img文件</span></div></div><div><div><div>3</div></div><div><span>fastboot flash vbmeta 你的vbmeta.img文件</span></div></div><div><div><div>4</div></div><div><span>##重启设备到恢复模式(Recovery)[或使用电源键+音量加键]</span></div></div><div><div><div>5</div></div><div><span>fastboot reboot recovery</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="957" height="459" src="/_astro/Pasted%20image%2020260719184738.CkqHov8N_Z8w4AP.webp" /></p><p>Recovery示例图：
<img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195444._6JIuC6a_ZtzdR8.webp" /></p></section><section><h3>刷入卡刷包<a href="#刷入卡刷包"><span>#</span></a></h3><p>通过音量键+-控制上下，电源键确定进入Apply update，接着选择Apply from ADB</p><p><img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195521.Btpih94O_zycGP.webp" /></p><p><img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195532.wgfTBrMb_UsSE0.webp" />
<img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195539.D5c7y808_Z2bkWyP.webp" /></p><p>接着在cmd输入<code>adb devices</code></p><p>若一切正常，应输出你的设备id：
<img alt="" loading="lazy" width="517" height="104" src="/_astro/Pasted%20image%2020260719185159.B6_9tzGe_1gfRmO.webp" /></p><p>接着在cmd输入<code>adb sideload 你的卡刷包文件地址</code>，并等待刷写完毕
<img alt="" loading="lazy" width="974" height="88" src="/_astro/Pasted%20image%2020260719185918.BLSPC622_Z2dlvsL.webp" /></p><p><em><strong>若中途出现如下界面提示重启，选择YES</strong></em>
<img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195546.DMN4aHnf_qHU9s.webp" /></p><p>刷写完毕后，进入Factory reset，Format data/factory reset，并选择Format data以清除Data数据保证正常开机
<img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195557.CTynZyiQ_1TVSGi.webp" /></p><p><img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195604.YM8kI0nD_2fApSH.webp" />
<img alt="" loading="lazy" width="1600" height="1200" src="/_astro/Pasted%20image%2020260719195616.C2nKJPL__Z1fKTfR.webp" /></p><p>清除后，返回主菜单，并选择第一项Reboot system now进行重启
<img alt="" loading="lazy" width="1200" height="1600" src="/_astro/Pasted%20image%2020260719195624.-VH8s6II_m9dju.webp" />
<img alt="" loading="lazy" width="1600" height="1200" src="/_astro/Pasted%20image%2020260719195634.CKcfpkqB_ZPlp3r.webp" /></p></section><section><h3>配置系统<a href="#配置系统"><span>#</span></a></h3><p>开机后正常配置完手机即可
<img alt="" loading="lazy" width="720" height="1600" src="/_astro/Pasted%20image%2020260719195639.B_mLhZ0z_1IAfTY.webp" /></p><p>接下来，你就可以体验流畅丝滑的类原生了😋</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/localdream/localdream/</id>
      <title type="text">[AI]在手机上本地运行图片生成AI</title>
      <published>2026-07-16T00:00:00.000Z</published>
      <updated>2026-07-16T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/localdream/localdream/"/>
      <summary type="text">利用Localdream项目在安卓设备上实现生成AI图片的操作。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p><a href="https://github.com/xororz/local-dream" target="_blank">Localdream</a>是一个安卓本地的<strong>Stable Diffusion</strong>工具，它允许使用CPU/GPU或骁龙NPU进行图片渲染</p><p>它拥有多种风格的模型可以使用，当然你也可以从模型网站上自己下载模型导入使用。</p><p><strong>设备要求：CPU渲染至少需要6G内存，NPU渲染至少8G内存，建议至少有2G空余内存的设备进行使用</strong></p><div><div><div></div><div>注意</div></div><div><p>NPU加速推理仅支持搭载部分骁龙芯片的安卓手机使用，天玑等仅能使用CPU推理</p></div></div><p>生成示例：
<img alt="" loading="lazy" width="512" height="512" src="/_astro/generated_image_1784439457108_1.DKMpptna_Z1O8Lel.webp" /></p><p><img alt="" loading="lazy" width="512" height="512" src="/_astro/generated_image_1784439457136_2.WuJFjS4G_1ypBzu.webp" /></p><p><img alt="" loading="lazy" width="512" height="512" src="/_astro/generated_image_1784439457153_3.8ijhS7M3_1VIBMo.webp" /></p><p><img alt="" loading="lazy" width="512" height="512" src="/_astro/generated_image_1784439456922_0.pMXMiIQE_ZDjXB4.webp" /></p></section>
<section><h1>操作步骤<a href="#操作步骤"><span>#</span></a></h1><section><h3>获取Localdream<a href="#获取localdream"><span>#</span></a></h3><p>前往<a href="https://github.com/xororz/local-dream" target="_blank">LocalDream</a>官方Github仓库，进入Releases获取安装包
<img alt="" loading="lazy" width="1002" height="259" src="/_astro/Pasted%20image%2020260719164102.IugAkJ8k_Ep88z.webp" /></p><div><div><div></div><div>提醒</div></div><div><p>第一项为正常版本
with_filter为屏蔽不良内容版本</p></div></div><p>下载完成后进行安装</p></section><section><h3>使用<a href="#使用"><span>#</span></a></h3><p>***此处使用NPU模型作示例，CPU模型操作步骤相同</p><p>选择你想生成的图片风格模型并点击下载(若下载速度过慢可以使用魔法或者前往设置使用国内下载源)
<img alt="" loading="lazy" width="420" height="837" src="/_astro/Pasted%20image%2020260719164657.YDrwYi6__sBFoy.webp" />
<img alt="" loading="lazy" width="423" height="940" src="/_astro/Pasted%20image%2020260719164740.wAWB5A4L_Z2kh44C.webp" />
<img alt="" loading="lazy" width="411" height="900" src="/_astro/Pasted%20image%2020260719164818.bn-PVCha_Z1nNL4T.webp" /></p><p>下载完成后即可点击选项卡进入生成页</p><p>其中img2img(img to img)为图片生成图片，即根据你提供的图片进行二次图片生成</p><p>提示词设置：</p><ol>
<li>图像生成提示：即你想生成的图像提示词，不支持中文，英文效果最好。</li>
<li>负面提示：即不想让它生成的内容，可以使用负面提示词来让生成结果更贴近你想要的结果</li>
</ol><p><img alt="" loading="lazy" width="427" height="873" src="/_astro/Pasted%20image%2020260719165431.BqFAKwVd_ZswqGs.webp" /></p><p>高级参数设置</p><ol>
<li>分辨率：即生成出来的图片分辨率，分辨率越大消耗的时间、资源越多</li>
<li>调度器：不同画面风格的采样器，影响画面色彩等[Karras&lt;降噪算法&gt;，能够提升画面细节]</li>
<li>生成步数：降噪绘制的次数，次数越多图像越细节，但是会增加渲染时间。（推荐使用20~28步，细节完整耗时适中。30步以上细节提升较小但消耗的时间多）</li>
<li>CFG Scale&lt;可以理解为文字语言大模型的&gt;”温度”，即提示词对画面的约束力。数值越高画面越贴近所给的提示词。（推荐6~8，关键词渲染精准，色彩自然。超过10画面会比较奇怪，不推荐）</li>
<li>批次数量：即想要一次性生成的图片数</li>
<li>[img2img]Denoise Strength&lt;即对原图的修改力度&gt;(推荐0.6)</li>
<li>随机种子：输入喜欢的AI图片的种子，在本次生成中可以使用种子图片的构图模板等（留空则纯随机）</li>
<li>CPU渲染会有一个Runtime选项，可以选择CPU或GPU渲染</li>
</ol><p><img alt="" loading="lazy" width="351" height="699" src="/_astro/Pasted%20image%2020260719165547.BhYgUTDl_ZPXMOF.webp" /></p><p>点击生成后等待一会即可输出生成结果</p><p>第一个按钮即收藏，第二个按钮为超分辨率，第三个按钮即保存到相册
<img alt="" loading="lazy" width="285" height="502" src="/_astro/Pasted%20image%2020260719170631.CO43_Mqg_14BRDd.webp" />
点击超分辨率按钮后，下载画风模型即可使用。
<img alt="" loading="lazy" width="225" height="309" src="/_astro/Pasted%20image%2020260719170747.JMid69My_EdThA.webp" />
超分辨率对比图：
<img alt="" loading="lazy" width="512" height="512" src="/_astro/Pasted%20image%2020260719170952.D8EJACVs_1BW1RW.webp" />
未超分</p><p><img alt="" loading="lazy" width="1280" height="1280" src="/_astro/Pasted%20image%2020260719171007.DuyqG2ia_Z1q77k5.webp" />
已超分</p></section></section>
<section><h1>已知问题<a href="#已知问题"><span>#</span></a></h1><p>Q：我下载解压完模型后，点击打开等了半天为什么出现无法连接到
后端错误？</p><p>A：关闭魔法、代理等，使用普通WIFI、流量进行使用，开启代理会导致前端无法连接至SD绘图后端</p><p>参考链接：<a href="https://github.com/xororz/local-dream" target="_blank">Localdream Github</a></p><p><a href="https://ld-guide.chino.icu/" target="_blank">Local Dream Docs</a></p></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/status/status/</id>
      <title type="text">搭建自己的在线网站监测网页</title>
      <published>2026-07-15T00:00:00.000Z</published>
      <updated>2026-07-15T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/status/status/"/>
      <summary type="text">利用UptimeRobot+开源项目+vercel实现免费部署网站监测</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>当你有了多个网站后，是否很难及时查看它们的在线状况？</p><p>没关系，现在有一个项目能够帮助你查看自己网站的<strong>在线情况以及情况统计</strong>😋</p><p>本文使用vercel部署，请确保你有可以正常使用的vercel账号</p><p><a href="status.jerry-nis.top">预览地址</a></p></section>
<section><h1>操作步骤<a href="#操作步骤"><span>#</span></a></h1><section><h3>申请API及配置站点<a href="#申请api及配置站点"><span>#</span></a></h3><p>前往<a href="https://uptimerobot.com/" target="_blank">UptimeRobot</a>并注册登录</p><p>点击右上角的New按钮新建一个监测
<img alt="" loading="lazy" width="1910" height="955" src="/_astro/Pasted%20image%2020260715220043.DIoIboTe_gNfr9.webp" /></p><p>![[Pasted image 20260715220209.png]]</p><p>回到首页你就能看见你的第一个监测创建成功了
![[Pasted image 20260715220250.png]]</p><p>来到API页面，点击创建主API并复制它备用。
![[Pasted image 20260715220350.png]]</p></section><section><h3>部署监测网页<a href="#部署监测网页"><span>#</span></a></h3><p>前往这个项目<a href="https://github.com/imsyy/site-status" target="_blank">imsyy/site-status</a></p><p>划到下方，点击vercel的部署按钮
<img alt="" loading="lazy" width="1910" height="955" src="/_astro/Pasted%20image%2020260715220632.CLSxIwuK_hI8Mw.webp" /></p><p>网站会自动跳转到vercel进行部署
<img alt="" loading="lazy" width="1910" height="955" src="/_astro/Pasted%20image%2020260715220955.ChHUkE7o_1tr46Q.webp" /></p><p>很明显这有问题，因为我们的步骤还没有完成
<img alt="" loading="lazy" width="1910" height="955" src="/_astro/Pasted%20image%2020260715221244.D4MWE3vK_1uhYUO.webp" />
点击前往仪表盘并前往环境变量配置
<img alt="" loading="lazy" width="1910" height="955" src="/_astro/Pasted%20image%2020260715221330.BdvSab2q_Z1rw1x0.webp" />
如图所示添加两个变量即可</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>DEPLOYMENT_PLATFORM  auto</span></div></div><div><div><div>2</div></div><div><span>API_KEY   你刚刚保存备用的API Key</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="765" height="910" src="/_astro/Pasted%20image%2020260715221524.BYKjS06s_tVkpf.webp" />
<img alt="" loading="lazy" width="761" height="931" src="/_astro/Pasted%20image%2020260715221548.t0wkj_QA_ZnWwNh.webp" /></p><p>点击重新部署
<img alt="" loading="lazy" width="435" height="125" src="/_astro/Pasted%20image%2020260715221601.CWfZjVbm_ZOppnW.webp" /><img alt="" loading="lazy" width="565" height="560" src="/_astro/Pasted%20image%2020260715221628.BOLO2TPJ_1CoE1F.webp" /></p><p>等待构建完成后访问vercel提供的地址即可访问
<img alt="" loading="lazy" width="1600" height="800" src="/_astro/Pasted%20image%2020260715221834.DRRj9RRI_Z2albvn.webp" /></p><p>如果有自己的域名的话可以前往domains选项卡添加自己的域名
<img alt="" loading="lazy" width="271" height="811" src="/_astro/Pasted%20image%2020260715222011.DGWxpAGD_ZtnUT9.webp" /></p><p>参考文献：</p><ul>
<li><a href="https://github.com/imsyy/site-status" target="_blank">imsyy/site-status</a></li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/droidsapce/droidspace/</id>
      <title type="text">在安卓设备上利用Droidspace运行原生性能linux</title>
      <published>2026-07-14T00:00:00.000Z</published>
      <updated>2026-07-14T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/droidsapce/droidspace/"/>
      <summary type="text">在手机上使用接近原生性能的Linux系统</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>droidspace是一项较新的项目，它是一款<strong>轻量级、可移植</strong>的 Linux 容器化工具。</p><p>它可以以<strong>原生的性能</strong>运行在你的安卓，linux设备上。</p><p>更多特性可以前往<a href="https://github.com/ravindu644/Droidspaces-OSS" target="_blank">Droidspace</a>的GitHub仓库查看具体实现技术。</p><p>本文使用了红米K60手机，系统为A16的澎湃3.0.8，内核为修补后支持droidspace的5.10内核，root管理器为kernels。</p><div><div><div></div><div>警告</div></div><div><p>本教程仅适用于已解BL锁已Root的设备
在操作前请确保你的数据已备份或拥有救机的能力，否则后果自负！</p></div></div></section>
<section><h1>操作步骤<a href="#操作步骤"><span>#</span></a></h1><section><h3>刷入内核<a href="#刷入内核"><span>#</span></a></h3><p>前往<a href="https://cdn.goldzxcbug.top/%E7%A7%BB%E5%8A%A8-Droidspaces-OSS" target="_blank">Goldbug网盘</a>，下载自己设备的内核包</p><p>K60使用GKI内核/AnyKernel3_gki_5.10.252_NTsync_Kswapd解耦_github @Star-ZER0.zip
<img alt="" loading="lazy" width="1113" height="654" src="/_astro/Pasted%20image%2020260714223717.D0D97wR6_Z1XKj0F.webp" /></p><p>前往<a href="https://github.com/libxzr/HorizonKernelFlasher/releases" target="_blank">HorizonKernelFlasher</a>Github仓库下载并安装刷写工具</p><p>前往Root管理器给与ROOT权限
<img alt="" loading="lazy" width="1080" height="2400" src="/_astro/Screenshot_2026-07-14-21-53-43-261_me.weishu.kernelsu.BdZHu53c_ZjpjUv.webp" /></p><p>接着按照下图所示选择你下载的内核包，待刷写完成后重启</p><p><img alt="" loading="lazy" width="344" height="171" src="/_astro/Pasted%20image%2020260714223937.odtdejSF_29mO1I.webp" />
<img alt="" loading="lazy" width="342" height="769" src="/_astro/Pasted%20image%2020260714224030.DcHYcGNq_Zv8lKT.webp" />
<img alt="" loading="lazy" width="1080" height="2400" src="/_astro/Screenshot_2026-07-14-21-52-59-791_xzr.hkf.CdSCTugA_243i7t.webp" /></p></section><section><h3>安装droidspace并配置容器<a href="#安装droidspace并配置容器"><span>#</span></a></h3><p>前往<a href="https://github.com/ravindu644/Droidspaces-OSS" target="_blank">DroidspaceGithub仓库</a>，进入releases下载APK并安装</p><p>安装完后前往kernelsu给与ROOT权限
<img alt="" loading="lazy" width="1080" height="2400" src="/_astro/Screenshot_2026-07-14-21-53-44-841_me.weishu.kernelsu.BLZsymHK_DMejf.webp" /></p><p>打开软件，进行OOBE配置后打开设置-要求，检测当前设备是否满足运行要求</p><p><img alt="" loading="lazy" width="1080" height="2400" src="/_astro/Screenshot_2026-07-14-21-53-58-260_com.droidspaces.app.XKuwknQa_Z4In9c.webp" /></p><p>前往<a href="https://cdn.goldzxcbug.top/%E7%A7%BB%E5%8A%A8-Droidspaces-OSS/Rootfs" target="_blank">GoldBug下载站</a>，下载自己需要的Rootfs(网站下面有各个版本的说明，按需选择)</p><p>下载完成后，回到软件，安装容器</p><p><img alt="" loading="lazy" width="345" height="767" src="/_astro/Pasted%20image%2020260714224902.DRy55Hsc_ZzEEqa.webp" />
<img alt="" loading="lazy" width="349" height="767" src="/_astro/Pasted%20image%2020260714224950.Dxusw3nR_Z6cijo.webp" /></p><p>容器详细设置根据自己需求自行配置即可</p><p><img alt="" loading="lazy" width="342" height="769" src="/_astro/Pasted%20image%2020260714225055.CFFWdo1Z_XXU7r.webp" /></p><p>点击运行即可开启容器
<img alt="" loading="lazy" width="1080" height="2400" src="/_astro/Pasted%20image%2020260714225138.DWdo_obq_201oEe.webp" /></p><p><img alt="" loading="lazy" width="720" height="1600" src="/_astro/Pasted%20image%2020260714225156.gyTULlK1_15lXt.webp" />
可以自行配置ssh，容器可以当作一台小型linux服务器。</p><p>容器占用内存400MB，日常后台影响较小，性能优越。</p><p>感谢作者酷安@Goldbus</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/astrobuilder/astrobuilder/</id>
      <title type="text">利用Astro搭建自己的博客</title>
      <published>2026-07-13T00:00:00.000Z</published>
      <updated>2026-07-13T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/astrobuilder/astrobuilder/"/>
      <summary type="text">利用Astro/Firefly模板搭建自己的博客，并部署到GithubPages实现全球访问。</summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>此篇教程是本人根据文档等自行探索出的小白教程，如有错误请指出</p><p>教程使用的是<em><strong>Firefly模板/主题的astro</strong></em></p><p>前提条件：</p><ol>
<li>
<p>有一台linux、windows、macos设备(此处以windows设备为教程设备)</p>
</li>
<li>
<p>能够顺畅的访问Github</p>
</li>
<li>
<p>有自己的一级域名(可选)</p>
</li>
</ol></section>
<section><h1>安装基础环境<a href="#安装基础环境"><span>#</span></a></h1><p>前往<strong>Nodejs官网</strong>(<a href="https://nodejs.org/zh-cn" target="_blank">Node.js — 在任何地方运行 JavaScript</a>)下载自己设备的安装包并点击安装</p><p><img alt="" loading="lazy" /></p><p><em>(无脑点击下一步直到安装完成)</em></p><p>打开<em>Windows Terminal/CMD</em></p><p>输入如下指令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm </span><span>-</span><span>v</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如有以下输出则<em><strong>安装成功</strong></em></p><p><img alt="" loading="lazy" /></p><p>输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm install </span><span>-</span><span>g pnpm</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>等待运行完毕后输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pnpm </span><span>-</span><span>v</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>若有以下输出则代表pnpm安装成功</p><p><img alt="" loading="lazy" /></p><p>下载Git工具<a href="https://git-scm.com/install/windows" target="_blank">Git - Install for Windows</a>以克隆模板项目</p><p><img alt="" loading="lazy" /></p><p><em>(根据自己的设备选择合适的安装包)</em></p><p>打开安装包后点击下一步，勾选下图选项即可</p><p><img alt="" loading="lazy" /></p><p>接着后余选项一直下一步即可直至安装完毕</p></section>
<section><h1>克隆项目<a href="#克隆项目"><span>#</span></a></h1><section><h3>克隆仓库<a href="#克隆仓库"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git clone https:</span><span>//</span></span><span>github.com</span><span><span>/</span><span>CuteLeaf</span><span>/</span><span>Firefly.git</span></span></div></div><div><div><div>2</div></div><div><span>cd Firefly</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>提示&gt; 如果git不下来可以手动下载解压使用。</div></div><div><p><img alt="" loading="lazy" width="1172" height="503" src="/_astro/inline-05.CwKZG-U-_5LBMu.webp" /></p></div></div></section><section><h3>安装依赖<a href="#安装依赖"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm install</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>正常输出如下</p><p><img alt="" loading="lazy" /></p></section><section><h3>测试项目<a href="#测试项目"><span>#</span></a></h3><p>输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" /></p><div><div><div></div><div>提示&gt; 实际上端口为4321，我在写文章时开了两个实例，端口自动叠加导致的4322端口，轻请以实际输出为准！</div></div><div></div></div><p>在你的浏览器中输入网址<strong><a href="http://localhost:XXXX/" target="_blank">http://localhost:XXXX/</a></strong></p><p>若成功访问，则说明你的操作正确，可以进行下一步。</p></section></section>
<section><h1>自定义项目<a href="#自定义项目"><span>#</span></a></h1><p>根据主题<strong><strong>官方文档</strong></strong><a href="https://docs-firefly.cuteleaf.cn/zh/" target="_blank">Firefly Docs</a>个性化你的博客，文档内容详细丰富</p><p>此处不再赘述细节</p><div><div><div></div><div>建议&gt;</div></div><div><p>有几个需要注意的点</p><ol>
<li>
<p>请注意你要部署网站服务器的访问速度和流量，本地图片会占用网站加载时间(别的内容加载完了图片还没加载出来)</p>
</li>
<li>
<p>建议涉及大量图片的使用<a href="https://cn.bing.com/search?qs=HS&amp;pq=%e5%9b%be%e5%ba%8a&amp;sk=CSYN1&amp;sc=13-2&amp;q=%E5%9B%BE%E5%BA%8A&amp;cvid=ff64d31ddeab4d81a568f34d5b3bf763&amp;gs_lcrp=EgRlZGdlKgYIABAAGEAyBggAEAAYQDIGCAEQABhAMgYIAhAAGEAyBggDEAAYQDIGCAQQABhAMgYIBRAAGEAyBggGEAAYQDIGCAcQRRg9MgYICBBFGD3SAQczOTZqMGo0qAIIsAIB&amp;FORM=ANAB01&amp;PC=U531" target="_blank">图床</a>(例如相册)</p>
</li>
<li>
<p>网页banner视频建议使用文件大小较小的视频文件，否则加载时间会过长</p>
</li>
<li>
<p>音乐播放器文档中主API似乎已经失效，可以将备用API的第一项复制替换到主API(网易云音乐解析如果使用私有歌单会播放失败，请使用公开歌单)</p>
</li>
</ol></div></div><p>贴一张我的awa</p><p><img alt="" loading="lazy" width="1600" height="813" src="/_astro/inline-08.CbPpfmSr_1V1ip4.webp" /></p></section>
<section><h1>构建项目<a href="#构建项目"><span>#</span></a></h1><div><div><div></div><div>提示&gt; 如果你有Nginx等静态网站服务器，此步可以输出静态网站，你可以直接使用此步输出的静态网站。</div></div><div><p>没有服务器的用户可以跳过此步(输出了没啥用)</p></div></div><p>在根目录打开终端，输入指令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm build</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>构建完成输出：</p><p><img alt="" loading="lazy" /></p><p>你可以在根目录下的dist文件夹中找到生成的静态文件，打包到服务器即可使用</p></section>
<section><h1>使用Github Pages搭建网站<a href="#使用github-pages搭建网站"><span>#</span></a></h1><section><h3>账号有关设置<a href="#账号有关设置"><span>#</span></a></h3><ol>
<li>
<p>访问<a href="https://github.com/" target="_blank">GitHub</a>主网站并注册账号</p>
</li>
<li>
<p>新建一个项目，项目名填<code>你的用户名.github.io</code>，并点击创建</p>
<p><img alt="" loading="lazy" width="1600" height="813" src="/_astro/inline-10.CDed1s3a_Z1eXmr7.webp" /></p>
</li>
</ol></section><section><h3>Git相关配置<a href="#git相关配置"><span>#</span></a></h3><p>回到项目根目录，右键空白位置打开git bash</p><p><img alt="" loading="lazy" /></p><p>打开后分别输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git config </span><span>--</span><span>global user.name </span></span><span>"你的github用户名"</span></div></div><div><div><div>2</div></div><div><span><span>git config </span><span>--</span><span>global user.email </span></span><span>"你的github绑定邮箱"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" /></p><p>接着创建SSH密匙，输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>ssh</span><span>-</span><span>keygen </span><span>-</span><span>t rsa </span><span>-</span><span>C </span></span><span>"你的github绑定邮箱"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后一路回车</p><p>进入 [C:\Users\用户名\ .ssh] （要勾选显示“隐藏的项目”），用记事本打开公钥 id_rsa.pub 文件并复制里面的内容。</p><p>进入github，打开github的设置，选择左边栏的 SSH and GPG keys，点击New SSH key添加密匙</p><p><img alt="" loading="lazy" /></p><p><img alt="" loading="lazy" width="1600" height="813" src="/_astro/inline-14.Du5ZSgqq_ZKe6l9.webp" /></p><p>title随便取一个名字，下面的key编辑框粘贴你刚刚复制的内容，最后点击下方的Add SSH Key完成添加</p><p><img alt="" loading="lazy" /></p><p>回到Git Bash</p><p>输入 <code>ssh -T git@github.com</code>,出现Are you…，输入yes回车即可。</p><p>出现如下输出即代表与Github建立了有效链接，可以进行下一步。</p><p><img alt="" loading="lazy" /></p></section><section><h3>部署项目<a href="#部署项目"><span>#</span></a></h3><p>在<code>.github/workflows</code>创建deploy.yml文件，并将下面的内容复制进去。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>name</span><span>: </span><span>Deploy to GitHub Pages</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>on</span><span>:</span></div></div><div><div><div>4</div></div><div><span>  </span><span>push</span><span>:</span></div></div><div><div><div>5</div></div><div><span>    </span><span>branches</span><span>: [</span><span>master</span><span>]</span></div></div><div><div><div>6</div></div><div><span>  </span><span>workflow_dispatch</span><span>:</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>permissions</span><span>:</span></div></div><div><div><div>9</div></div><div><span>  </span><span>contents</span><span>: </span><span>read</span></div></div><div><div><div>10</div></div><div><span>  </span><span>pages</span><span>: </span><span>write</span></div></div><div><div><div>11</div></div><div><span>  </span><span>id-token</span><span>: </span><span>write</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>jobs</span><span>:</span></div></div><div><div><div>14</div></div><div><span>  </span><span>build</span><span>:</span></div></div><div><div><div>15</div></div><div><span>    </span><span>runs-on</span><span>: </span><span>ubuntu-latest</span></div></div><div><div><div>16</div></div><div><span>    </span><span>steps</span><span>:</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Checkout</span></div></div><div><div><div>18</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/checkout@v4</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Setup pnpm</span></div></div><div><div><div>21</div></div><div><span>        </span><span>uses</span><span>: </span><span>pnpm/action-setup@v4</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Setup Node</span></div></div><div><div><div>24</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/setup-node@v4</span></div></div><div><div><div>25</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>26</div></div><div><span>          </span><span>node-version</span><span>: </span><span>22</span></div></div><div><div><div>27</div></div><div><span>          </span><span>cache</span><span>: </span><span>pnpm</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Install dependencies</span></div></div><div><div><div>30</div></div><div><span>        </span><span>run</span><span>: </span><span>pnpm install</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Build</span></div></div><div><div><div>33</div></div><div><span>        </span><span>run</span><span>: </span><span>pnpm build</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Upload artifact</span></div></div><div><div><div>36</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/upload-pages-artifact@v3</span></div></div><div><div><div>37</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>38</div></div><div><span>          </span><span>path</span><span>: </span><span>dist</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>  </span><span>deploy</span><span>:</span></div></div><div><div><div>41</div></div><div><span>    </span><span>needs</span><span>: </span><span>build</span></div></div><div><div><div>42</div></div><div><span>    </span><span>runs-on</span><span>: </span><span>ubuntu-latest</span></div></div><div><div><div>43</div></div><div><span>    </span><span>environment</span><span>:</span></div></div><div><div><div>44</div></div><div><span>      </span><span>name</span><span>: </span><span>github-pages</span></div></div><div><div><div>45</div></div><div><span>      </span><span>url</span><span>: </span><span>${{ steps.deployment.outputs.page_url }}</span></div></div><div><div><div>46</div></div><div><span>    </span><span>steps</span><span>:</span></div></div><div><div><div>47</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Deploy to GitHub Pages</span></div></div><div><div><div>48</div></div><div><span>        </span><span>id</span><span>: </span><span>deployment</span></div></div><div><div><div>49</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/deploy-pages@v4</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>接着打开根目录下的astro.config.mjs文件，设置site和base</p><p>site:“<a href="https://%E4%BD%A0%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D.github.io" target="_blank">https://你的用户名.github.io</a>”,</p><p>base:”/”</p><p><img alt="" loading="lazy" /></p><p>打开你创建的仓库，复制ssh链接，并在终端输入<code>git remote add origin git@github.com:xxx/xxx</code>以连接到github仓库</p><p><img alt="" loading="lazy" width="1600" height="813" src="/_astro/inline-18.zgnM7a9J_1H0pPz.webp" /></p><p><img alt="" loading="lazy" /></p><p>随后，提交所有变更，在终端输入<code>git add .</code></p><p>接着，创建一次本地提交，在终端输入<code>git commit -m "update"</code></p><p>最后，把本地更改推送到远程仓库，在终端输入<code>git push</code></p><p><img alt="" loading="lazy" /></p><p>完成后，你应该能看github里新增的文件了</p><p><img alt="" loading="lazy" width="1600" height="813" src="/_astro/inline-21.DQp5KZHM_Z25hlRO.webp" /></p><p>随后我们进入构建页面，点击Action</p><p><img alt="" loading="lazy" /></p><p>可以看到构建中出现了错误，原因是github pages并没有启用</p><p><img alt="" loading="lazy" width="1431" height="423" src="/_astro/inline-23.C10Qr7dn_2u3pwo.webp" /></p><p>点击setting，来到设置页面，然后再左侧栏中点击Pages进入页面设置</p><p><img alt="" loading="lazy" /></p><p><img alt="" loading="lazy" /></p><p>将源设置为github构建</p><p><img alt="" loading="lazy" /></p><p>接着我们回到Actions，进入失败的工作流，点击重新构建</p><p><img alt="" loading="lazy" /></p><p><img alt="" loading="lazy" width="1303" height="704" src="/_astro/inline-28.gLy6j3aT_nseAQ.webp" /></p><p><img alt="" loading="lazy" width="1569" height="514" src="/_astro/inline-29.wLs0FQD9_Z2g1Lm0.webp" /></p><p><img alt="" loading="lazy" /></p><p><img alt="" loading="lazy" /></p><p>等待工作流构建成功后，回到Setting-Pages，我们可以看到我们网站的网址</p><p><img alt="" loading="lazy" /></p><p>访问<code>用户名.github.io</code></p><p><img alt="" loading="lazy" width="1600" height="849" src="/_astro/inline-33.CajHFlnq_ZUBzFD.webp" /></p><p>可以看到访问正常，网站成功部署</p><div><div><div></div><div>Tip</div></div><div><p>修改网站或编写文章后，可以使用pnpm dev预览，接着依次在根目录下执行下列命令可以推送新内容到github实现自动构建自动发布</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git add .</span></div></div><div><div><div>2</div></div><div><span><span>git commit </span><span>-</span><span>m </span></span><span>"update"</span></div></div><div><div><div>3</div></div><div><span>git push</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div></section><section><h3>扩展内容<a href="#扩展内容"><span>#</span></a></h3><p>如果你有自己的域名的话，可以去DNS里添加CNAME解析，内容为<code>用户名.github.io</code></p><p><img alt="" loading="lazy" /></p><p>回到GitHub的Pages页，将你的域名输入到编辑框里，点击Save***(如果下方启用https没有勾选请尽量勾选)***</p><p>这样你就可以使用自己的域名来访问你的网站了
<img alt="" loading="lazy" width="1600" height="852" src="/_astro/Pasted%20image%2020260714130944.CMIUJVvv_Z2iJIiH.webp" /></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://www.jerrynis.com/posts/hello/hello/</id>
      <title type="text">Hello World</title>
      <published>2026-01-01T00:00:00.000Z</published>
      <updated>2026-01-01T00:00:00.000Z</updated>
      <author><name>Jerrynis</name></author>
      <link rel="alternate" href="https://www.jerrynis.com/posts/hello/hello/"/>
      <summary type="text">你好世界！</summary>
      <content type="html"><![CDATA[<p>来到astro的第一篇文章</p>]]></content>
    </entry>
</feed>
