写这篇之前先交代一句:网站迁移这件事,干货全藏在差点把数据搞没的那几次折腾里,不在最后上线那一下。
事情的起点是一个批量脚本。我想给全站文章重建一套统一的标签体系,三百多篇 markdown 要过一遍机器。动手前我做了个习惯性动作:把整个 content 目录在项目外备份了一份。就是这个备份,几个小时后救了全站。
打标脚本跑完,我没多想就开始收拾新分类结构。直到打开一篇文章,发现正文没了,只剩标题日期那几行元数据。再翻,全站都是这样。三百多篇的文字和图片引用,一夜之间全部蒸发。
第一个念头是完蛋。冷静下来才想起动手前那份备份。恢复方案很直接:正文整体从备份拿回来,标签用新体系,两边一拼,全站复原。1274 处图片引用零丢失。整个过程十分钟不到,冷汗还没干透。
那天剩下的时间顺理成章:清理掉两篇历史遗留的空文件,文章数落在三百六十七;把分类 URL 从带中文的长链接改成干净短链接,老链接做 301 跳转,收藏夹里那些旧地址不至于失效;接入 Google AdSense,代码原样塞进全站共用的模板,一改全站生效。
迁移才是真战场
网站之前没有任何版本控制,这本身就是隐患。我先做了第一次完整快照,把三百多篇文章、模板、一千二百多张图片整体归档,然后才敢动 git。
真正磨人的是上传。图片总量五百多兆,常规 git 推送反复失败,换了好几个姿势才定位到是网络环境对大包连接的天然不友好。最后的解法是 git-lfs:一千二百多张图转成指针进 git,大文件走它自己的通道逐文件传,几分钟就推完了。顺带还处理了 Windows 证书校验的怪癖,以及一次清理操作把本地 git 对象误删的乌龙,好在远端完整,拉回来就好。
站点最后落在 Cloudflare Pages,主域名切换过去,线上验证:文章数对得上,新分类 URL 全部生效,AdSense 正常。中途还有一段小插曲,域名激活后短暂报错,排查半天发现是平台状态到边缘路由的传播延迟,几十秒后自行恢复,虚惊一场。
收尾往站点根目录放了 ads.txt、favicon 和 logo,全站 favicon 挂上,标签栏终于有了自己的图标。
如果只留一条经验,是这句:批量改数据之前,先备份到项目目录之外,每跑完一步校验文件完整性再走下一步。 那天要不是那个备份,这三百多篇就真没了。