Repository Wiki
LyraVoid/Mizuki

迁移指南(含 Shirone 重构版迁移)

本页汇总 Mizuki 项目涉及的两条迁移路径:一是从 Mizuki 迁移到全面重构的后继项目 Shirone;二是在继续使用 Mizuki 的前提下,把博客从「单仓库模式」迁移到「代码/内容分离模式」。所有步骤均来自仓库中的官方迁移文档。

Purpose and Scope

本页面覆盖以下内容:

  • Shirone 重构版迁移:Mizuki 已宣布停止更新与维护,官方建议迁移到后继项目 Shirone;本页说明官方通知的原文出处、迁移建议与决策依据。
  • 单仓库 → 内容分离模式迁移:基于 docs/MIGRATION_GUIDE.md 的完整五步迁移流程,包括内容仓库创建、内容复制、.env 配置、pnpm run sync-content 同步、原仓库清理、本地/构建测试以及日常工作流。
  • 迁移相关配置项:ENABLE_CONTENT_SYNC、CONTENT_REPO_URL、USE_SUBMODULE 的作用与使用方式。
  • 常见故障与回滚:同步失败、Windows 符号链接问题、私有仓库认证问题以及回滚到单仓库模式的方法。

以下主题有意留给兄弟页面,本页只做指引:

  • 内容分离的原理、环境变量全集与私有仓库认证细节 → 参见「内容分离」页面(源文档:docs/CONTENT_SEPARATION.md)。
  • 各部署平台(GitHub Pages / Vercel / Netlify / Cloudflare Pages)的具体配置与故障排查 → 参见「部署」页面(源文档:docs/DEPLOYMENT.md)。
  • 内容仓库的推荐目录结构与编写规范 → 参见「内容仓库结构」页面(源文档:docs/CONTENT_REPOSITORY.md)。
  • 内容更新后自动触发构建的配置 → 参见「自动构建触发」相关页面(源文档:docs/AUTO_BUILD_TRIGGER.md)。

Overview

Mizuki 是一个基于 Astro 的博客模板项目。围绕它存在两类完全不同的"迁移"需求:

  1. 项目级迁移(Mizuki → Shirone):Mizuki 官方已发布公告,项目即将停止更新与维护,由功能基本一致、架构全新升级的 Shirone 接棒。对希望持续获得更新与支持的用户,官方建议直接迁移到新项目仓库。
  2. 仓库结构迁移(单仓库 → 分离模式):Mizuki 支持把文章(posts)、特殊页面(spec)、数据文件(anime.ts / projects.ts / skills.ts / timeline.ts)与图片资源(albums / diary)从代码仓库中剥离,放入独立的内容仓库(推荐的仓库名为 Mizuki-Content),再通过 Git Submodule 或独立模式关联。这一模式让「写博客」与「改代码」彻底解耦,也更方便私有内容仓库、多端协作与自动构建。

两条路径的选择标准很直接:如果接受切换到新一代架构以获得长期维护,选择 Shirone;如果只是想在不换框架的前提下分离内容与代码,按本页第二部分操作即可。

官方停更通知原文(中文版 README)如下:

[!WARNING]

⚠️ 项目停止更新与迁移通知

本项目(Mizuki)即将停止更新与维护。 全新全面重构版本 Shirone 现已发布,功能与本项目基本一致,并在架构与体验上进行了全面重构与优化。建议前往新项目获取最新支持与更新:

Source: README.md

同样的通知还出现在 README.en.md、README.ja.md、README.tw.md 与 docs/README.md 中。

Architecture

迁移决策总览

下图展示一个 Mizuki 用户面对的两条迁移路径及其后续流程:

Loading diagram...

设计意图:官方把「换项目」和「换仓库结构」作为两个正交的决策点。Shirone 路径只需要切换仓库与跟随新项目的部署说明;分离模式路径则完全在 Mizuki 体系内完成,不依赖任何外部服务。

迁移前后的仓库结构对比

内容分离迁移的本质是把下面左侧的单仓库结构重组为右侧的「代码仓库 + 内容仓库」双仓库结构:

Loading diagram...

设计意图(WHY):

  • 职责分离:文章、数据与图片属于"高频低风险改动",与主题代码的"低频高风险改动"放在同一仓库会互相污染提交历史;分离后内容仓库可以设为私有,只暴露构建产物。
  • 同步机制复用:迁移后代码仓库通过 pnpm run sync-content 拉取内容(Submodule 模式下等价于 git submodule update --remote --merge),Mizuki 自身不感知内容来源差异,因此迁移对站点构建是透明的。
  • 目录约定一致:内容仓库内部沿用 posts、spec、data、images 的目录划分,与 docs/CONTENT_REPOSITORY.md 的推荐结构完全对应,降低迁移心智成本。

迁移到 Shirone 重构版

官方公告与现状

Mizuki 在所有语言的 README 顶部都放置了停更公告。以中文版为例:

  • 公告位置:README.md
  • 新项目地址:https://github.com/lyraVoid/shirone
  • 官方对 Shirone 的定位:「功能与本项目基本一致,并在架构与体验上进行了全面重构与优化」;英文版 README 表述为 "equivalent features and a modernized architecture"。

文档索引页 docs/README.md 同样将 Shirone 标注为「全新全面重构版本(功能基本一致,架构全新升级)」。

迁移建议

由于 Shirone 是独立仓库,本仓库中没有提供自动化迁移脚本或专门的 Mizuki → Shirone 迁移文档;迁移方式以「前往新项目并按其 README 初始化」为主。基于 Mizuki 本身的仓库结构,迁移时需要带走的内容与下文「内容分离迁移」步骤 2 中的复制清单一致:

  • 博客文章:src/content/posts/
  • 特殊页面(关于、友链等):src/content/spec/
  • 数据文件:src/data/anime.ts、src/data/projects.ts、src/data/skills.ts、src/data/timeline.ts
  • 图片资源:public/images/albums/、public/images/diary/

⚠️ Mizuki 已停止维护意味着后续的安全修复与功能更新只发生在 Shirone;如果暂时留在 Mizuki,也建议至少完成下文的内容分离迁移,使内容资产独立于模板代码,为将来再次迁移降低成本。

单仓库 → 内容分离模式迁移(核心流程)

以下五步全部来自官方迁移文档 docs/MIGRATION_GUIDE.md。官方迁移前检查清单:

  • 备份整个项目(重要!)
  • 确保所有更改已提交到 Git
  • 了解你要使用的模式(推荐 Submodule)
  • 在 GitHub/GitLab 创建新的内容仓库

Source: MIGRATION_GUIDE.md

步骤 1:创建内容仓库

bash
1# 创建并进入新目录 2mkdir Mizuki-Content 3cd Mizuki-Content 4 5# 初始化 Git 仓库 6git init 7 8# 创建目录结构 9mkdir -p posts spec data images/albums images/diary images/posts 10 11# 创建 README 12cat > README.md << 'EOF' 13# Mizuki 博客内容 14 15这是 Mizuki 博客的内容仓库,包含所有文章、数据和图片。 16 17## 目录结构 18 19- `posts/` - 博客文章 20- `spec/` - 特殊页面 (关于、友链等) 21- `data/` - 数据文件 (番剧、项目、技能、时间线) 22- `images/` - 图片资源 23 24## 使用方法 25 26此仓库作为 Mizuki 代码仓库的内容源,通过 Git Submodule 或独立模式关联。 27 28详细说明请查看: https://github.com/matsuzaka-yuki/Mizuki 29EOF

Source: MIGRATION_GUIDE.md

注意目录结构中有 images/posts,但后文复制图片时只涉及 albums 与 diary 两个子目录——这是为其他来源的图片预留的位置。

步骤 2:从 Mizuki 项目复制内容

bash
1# 设置路径变量 2MIZUKI_PATH="/path/to/your/Mizuki" 3CONTENT_PATH="/path/to/Mizuki-Content" 4 5# 复制文章 6cp -r "$MIZUKI_PATH/src/content/posts/"* "$CONTENT_PATH/posts/" 7 8# 复制特殊页面 9cp -r "$MIZUKI_PATH/src/content/spec/"* "$CONTENT_PATH/spec/" 10 11# 复制数据文件 12cp "$MIZUKI_PATH/src/data/anime.ts" "$CONTENT_PATH/data/" 2>/dev/null || echo "anime.ts not found" 13cp "$MIZUKI_PATH/src/data/projects.ts" "$CONTENT_PATH/data/" 2>/dev/null || echo "projects.ts not found" 14cp "$MIZUKI_PATH/src/data/skills.ts" "$CONTENT_PATH/data/" 2>/dev/null || echo "skills.ts not found" 15cp "$MIZUKI_PATH/src/data/timeline.ts" "$CONTENT_PATH/data/" 2>/dev/null || echo "timeline.ts not found" 16 17# 复制图片 18cp -r "$MIZUKI_PATH/public/images/albums/"* "$CONTENT_PATH/images/albums/" 2>/dev/null || echo "albums not found" 19cp -r "$MIZUKI_PATH/public/images/diary/"* "$CONTENT_PATH/images/diary/" 2>/dev/null || echo "diary not found" 20 21echo "✅ 内容复制完成!"

Source: MIGRATION_GUIDE.md

实现细节:数据文件和图片的复制命令都带 2>/dev/null || echo "xxx not found" 兜底——因为并不是每个站点都有番剧、时间线等数据,缺文件属于正常情况而不是错误。这一设计让同一份脚本可以直接在「最小化模板」与「完整站点」上运行。

步骤 3:提交内容仓库

bash
1cd "$CONTENT_PATH" 2 3# 添加所有文件 4git add . 5 6# 提交 7git commit -m "Initial commit: Migrate content from Mizuki monorepo" 8 9# 添加远程仓库 (替换为你的仓库地址) 10git remote add origin https://github.com/your-username/Mizuki-Content.git 11 12# 推送 13git branch -M master 14git push -u origin master 15 16echo "✅ 内容仓库已推送!"

Source: MIGRATION_GUIDE.md

git branch -M master 强制把当前分支重命名为 master,保证后续 Submodule 与部署平台的默认分支引用一致。

步骤 4:配置 Mizuki 代码仓库

bash
1cd "$MIZUKI_PATH" 2 3# 创建 .env 文件 4cp .env.example .env 5 6# 编辑 .env 文件,启用内容分离 7cat > .env << 'EOF' 8# 启用内容分离 9ENABLE_CONTENT_SYNC=true 10 11# 内容仓库配置 12CONTENT_REPO_URL=https://github.com/your-username/Mizuki-Content.git 13USE_SUBMODULE=true 14EOF 15 16# 运行同步脚本 17pnpm run sync-content 18 19# 提交更改 20git add .env.example 21git commit -m "Enable content separation" 22git push

Source: MIGRATION_GUIDE.md

三个环境变量构成内容分离的最小配置:ENABLE_CONTENT_SYNC=true 打开同步总开关,CONTENT_REPO_URL 指向内容仓库,USE_SUBMODULE=true 选择 Submodule 关联方式(另一个可选模式是独立模式,详见「内容分离」页面)。

步骤 5:清理原仓库中的内容(可选,危险操作)

官方明确警告:只有在确认内容已成功迁移后才执行此步骤。

bash
1cd "$MIZUKI_PATH" 2 3# 备份原内容 (以防万一) 4mkdir -p ../mizuki-content-backup 5cp -r src/content/posts ../mizuki-content-backup/ 6cp -r src/content/spec ../mizuki-content-backup/ 7cp -r src/data ../mizuki-content-backup/ 8cp -r public/images ../mizuki-content-backup/ 9 10# 删除已迁移的内容 (保留目录结构) 11rm -rf src/content/posts/* 12rm -rf src/content/spec/* 13rm -f src/data/anime.ts src/data/projects.ts src/data/skills.ts src/data/timeline.ts 14rm -rf public/images/albums/* public/images/diary/* 15 16# 创建 .gitkeep 文件保留目录 17touch src/content/posts/.gitkeep 18touch src/content/spec/.gitkeep 19touch public/images/albums/.gitkeep 20touch public/images/diary/.gitkeep 21 22# 提交更改 23git add . 24git commit -m "Remove migrated content (now in separate repository)" 25git push

Source: MIGRATION_GUIDE.md

设计意图:先做一次 ../mizuki-content-backup 备份再删除;删除后用 .gitkeep 占位,让 Git 继续跟踪空目录,避免构建工具因为目录缺失而报错。

端到端时序

Loading diagram...

步骤顺序不可颠倒的原因:内容必须先在远端仓库存在并完成一次同步验证,才能安全清理本地副本;否则一旦同步脚本失败,原内容已被删除。

测试验证

迁移完成后,官方要求先本地验证再部署。

本地测试

bash
1cd "$MIZUKI_PATH" 2 3# 同步内容 4pnpm run sync-content 5 6# 启动开发服务器 7pnpm dev 8 9# 访问 http://localhost:4321 检查: 10# - 文章是否正常显示 11# - 图片是否正确加载 12# - 特殊页面是否工作 13# - 数据页面是否正常 (番剧、项目等)

Source: MIGRATION_GUIDE.md

构建测试

bash
1# 构建项目 2pnpm build 3 4# 预览构建结果 5pnpm preview 6 7# 检查所有功能是否正常

Source: MIGRATION_GUIDE.md

本地测试覆盖四类内容(文章、图片、特殊页面、数据页面),恰好对应步骤 2 复制的四类资产;pnpm preview 用于在生产构建产物上复核,避免 dev 模式的宽松行为掩盖问题。

迁移后的日常工作流

更新内容(独立模式)

bash
1# 1. 在内容仓库中修改 2cd "$CONTENT_PATH" 3# 编辑文件... 4git add . 5git commit -m "Update content" 6git push 7 8# 2. 在代码仓库中同步 9cd "$MIZUKI_PATH" 10pnpm run sync-content

Source: MIGRATION_GUIDE.md

使用 Submodule 时

bash
1cd "$MIZUKI_PATH" 2 3# 更新 submodule 到最新版本 4git submodule update --remote --merge 5 6# 或者使用同步脚本 (推荐) 7pnpm run sync-content 8 9# 提交 submodule 更新 10git add content 11git commit -m "Update content submodule" 12git push

Source: MIGRATION_GUIDE.md

从 git add content 可以看出:Submodule 模式下内容会被检出到代码仓库内的 content 目录,代码仓库记录的是 submodule 指针(commit SHA)。官方推荐用 pnpm run sync-content 统一两条模式的操作入口,避免记忆两套命令。

部署配置

迁移完成后,需要在部署平台配置环境变量:

bash
ENABLE_CONTENT_SYNC=true CONTENT_REPO_URL=https://github.com/your-username/Mizuki-Content.git USE_SUBMODULE=true

Source: MIGRATION_GUIDE.md

部署平台的环境变量必须与本地 .env 保持一致,否则 CI 构建时无法拉取内容仓库。私有仓库认证、GitHub Actions、Vercel 等平台的完整配置,参见「内容分离」页面的 CI/CD 部署章节(源文档:docs/CONTENT_SEPARATION.md)。

Configuration Options

迁移涉及的最小配置集合如下(完整变量清单在「内容分离」页面):

变量类型迁移场景取值说明
ENABLE_CONTENT_SYNCbooleantrue内容分离总开关;设为 false 即回退到单仓库模式
CONTENT_REPO_URLstringhttps://github.com/your-username/Mizuki-Content.git内容仓库地址,同步脚本拉取目标
USE_SUBMODULEbooleantrue(推荐)关联模式:true 为 Git Submodule,内容检出到代码仓库 content 目录;false 为独立模式

Source: MIGRATION_GUIDE.md

配套命令:

命令用途
pnpm run sync-content拉取/同步内容仓库到构建目录,两种模式通用
pnpm run check-env检查环境变量配置是否正确
pnpm dev / pnpm build / pnpm preview本地开发、生产构建与构建产物预览
git submodule update --remote --mergeSubmodule 模式下手动更新内容到最新版本

Source: MIGRATION_GUIDE.md · MIGRATION_GUIDE.md · MIGRATION_GUIDE.md

Failure Modes, Edge Cases & Concurrency

以下是官方文档明确列出的故障与边界情况:

同步脚本失败

排查顺序(来自 FAQ):

  1. 网络连接是否正常
  2. Git 凭据是否配置正确
  3. ENABLE_CONTENT_SYNC=true 是否已设置
  4. CONTENT_REPO_URL 是否正确
  5. 是否有足够的磁盘空间

并运行 pnpm run check-env 检查配置。

Source: MIGRATION_GUIDE.md

Windows 符号链接问题

独立模式(非 Submodule)下同步脚本可能使用符号链接;Windows 上若权限不足会失败。官方说明:需要以管理员身份运行,或者脚本会自动切换到复制模式。

Source: MIGRATION_GUIDE.md

私有仓库认证问题

私有内容仓库需要额外认证配置,官方指引参见 docs/CONTENT_SEPARATION.md 的「私有仓库配置」章节。

Source: MIGRATION_GUIDE.md

回滚到单仓库模式

text
在 .env 中设置 ENABLE_CONTENT_SYNC=false,然后从备份或内容仓库复制内容回本地。

Source: MIGRATION_GUIDE.md

这正是迁移前检查清单强调「备份整个项目」的原因:删除原内容(步骤 5)之后,唯一可靠的内容来源是内容仓库远端与步骤 5 中创建的 ../mizuki-content-backup。

一致性注意点

  • 清理时机:步骤 5 是唯一不可逆操作,必须先通过本地 + 构建测试;官方以 ⚠️ 警告标出。
  • Submodule 指针漂移:git submodule update --remote --merge 会把 submodule 指针推到内容仓库最新 commit,之后必须在代码仓库中提交该指针变更,否则 CI 仍会拉取旧内容。
  • Mizuki → Shirone 的迁移没有自动脚本:本仓库未提供跨项目迁移工具,需手动搬运内容资产。

Performance / Operational Notes

  • 内容体量主导迁移耗时:五步流程中最耗时的是复制图片(public/images/albums、public/images/diary),首次 git push 内容仓库的耗时与图片总量正相关。
  • 日常同步成本:分离后每次写博客 = 内容仓库一次 commit + 代码仓库一次 pnpm run sync-content(Submodule 模式下还需提交指针),相比单仓库多一步,换取内容私有化与模板可独立升级。
  • 官方建议:迁移前先在测试环境中验证整个流程。

Source: MIGRATION_GUIDE.md