暂未播放
0:00
0:00

博客内容分离到私有仓库,构建时自动同步

1131 字
6 分钟
博客内容分离到私有仓库,构建时自动同步

博客用的是 Firefly,fork 之后改了不少东西,想着把主题仓库开源出来。但仓库里的 src/content 装的是文章、动态、足迹、项目介绍,这些是要自己留着的。

一开始想的是清历史,用 filter-repo 把 content 从所有提交里抹掉。动手前先摸了下底,发现代价比想象中大:Firefly 上游的第一个提交就带着 content 目录,要清掉它就得改写根提交,接着全部提交的 SHA 都会变,之后再也无法和上游 merge。而且清历史也不等于内容消失了,远端 force push 之后,旧的提交在一段时间内还是能通过 SHA 访问到。

于是换了个思路:内容搬走,主仓库只留代码。

结构#

  • 私有仓库 my-blog-content,目录结构原样镜像 src/content/*
  • 主仓库 .gitignore 里加一行 src/content/
  • package.json 的 dev 和 build 第一步都跑 node scripts/sync-content.mjs

本地开发时,src/content 就是那个私有仓库的工作副本,写文章、提交都在它自己的 git 里完成,主仓库全程不掺和。

同步脚本的取舍#

脚本要处理的情况只有几种,但每一种都有伤到数据的可能,所以原则定得比较死:宁可什么都不做,也不动你的文件。

src/content 状态行为
不存在clone 内容仓库
是工作副本且没有未提交改动git pull --ff-only
有未提交改动跳过更新,保留工作副本
存在但不是 git 仓库默认不动(加 --force 才改名备份后重新克隆)
拉取失败但本地有内容打警告,继续用现有的
拉取失败且本地没有内容中止构建

最后一条是刻意加的。构建平台拉不到内容时如果不中止,就会部署出一个没有文章的站点,这比构建失败更难发现。

两个踩到的坑#

浅克隆会让更新永久失效#

内容仓库很小,一开始想着用 --depth 1 省点时间,同步时 git fetch --depth 1 再 git merge --ff-only FETCH_HEAD。

结果是永远更新不了,git 报历史不相干。原因是浅克隆拿到的是一棵孤立的树,fetch 回来的又是另一棵,两者没有共同祖先,--ff-only 直接判定不可快进。改成全量克隆就好了,反正仓库里只有几十个文本文件。

|| true 会吞掉它前面整段的失败#

原来的构建链是这种写法:

Terminal window
... && npx tsx scripts/build-hitokoto.ts || true && npx tsx scripts/...

|| true 绑定的是它前面那条完整的链。我把内容同步放到构建链最前面之后,同步失败也照样返回 0,构建继续往下跑,最后部署出去一个空站。

改成用括号把可选步骤圈起来:

Terminal window
node scripts/sync-content.mjs && (node scripts/sync-friends.mjs && npx tsx ... || true) && ...

同步这一步失败就会老实中断。

把 content 移出索引#

工作区里的文件要留着(还要继续写文章),但主仓库不能再跟踪这个目录。

常规做法是 git rm -r --cached src/content,只是我这边的 git 工作区是映射进来的目录,之前有被 git rm 连磁盘文件一起清掉的经历,不太敢再用它。换成只动索引的写法:

Terminal window
git ls-files -z -- src/content | git update-index --force-remove -z --stdin

跑完 git status 会看到那批文件显示成 D,但磁盘上一个都没少。提交之后,主仓库就彻底不跟踪 src/content 了。

内容推送了,站点却不更新#

这个问题比较隐蔽。EdgeOne 的 Git 自动部署只监听主仓库,内容仓库推文章它完全不知道。表现就是文章推上去了,本地 dev 能看到,线上还是旧的。

办法是在内容仓库加一个 workflow,push 到 main 时主动打一次 EdgeOne 的部署钩子。几个细节:

  • 钩子是 POST 触发,URL 本身就带认证,不需要额外 header 或者 body,带不带都能正常返回
  • 加了 concurrency 配置,连着推几篇只触发一次部署,不会排队构建好几遍
  • 钩子 URL 放在仓库 Secret 里。没配的时候 workflow 只打一行 warning 就跳过,这样不会天天红叉,但也得记得配,否则就是静默失效

剩下的事#

内容分离之后,有几处还指着老路径。写博客的机器人之前是往主仓库的 src/content/posts 推文章的,现在得改成指向内容仓库。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
博客内容分离到私有仓库,构建时自动同步
https://x1anyu.cn/posts/18/
作者
羡鱼
发布于
2026-10-08
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
我把友链系统重做成了一套自动巡检 + 自助申请的玩意
组件实现友链这东西看着简单,维护起来全是琐碎。我干脆把它拆成两个仓库,真源只留一份,申请走 Issue 模板机器人核验,每天定时巡检谁挂了。整套跑在 GitHub Actions 上,零服务器成本。
2
给博客写了个缓存预热脚本
项目实践博客部署在 EdgeOne 免费版上,没有预热 API。手里有台服务器能公网出访,就写了个脚本模拟真实访问把边缘缓存填一遍,顺带做了并发、重试、缓存命中统计和二次验证。
3
Fork Friend-Circle-Lite 后我做了什么
项目实践我博客一直想要一个友链聚合页——把朋友们最近的 RSS 文章、友链可达性、主页截图汇到一页里。之前用的 checkflink 已经不再能满足我的使用要求,所以我又在原作者新项目的基础上进行了二开...
4
把 Aemeath 的站点统计页搬进我的博客
项目实践想要个自己的数据统计页,就把 Aemeath 那套整页搬了过来。数据走 Umami 公开分享不用后端,但地图要换成合规的,推送节奏的口径也得按自己仓库重算,原作者写死的参数照抄会出错。
5
主题合并排错记:git 误删工作树、架构漂移与 CSS 三连击
主题维护主题更新了一直嫌麻烦不想动。这次终于把上游合并进来,本以为最麻烦的是解冲突——平时就加了点小功能嘛。结果呢,冲突只占开头一小段,后面全是排错
随机文章随机推荐

评论区

Profile Image of the Author
羡鱼
临渊空慕水中鱼, 不如携风自渡河.
分类
标签
最新动态
站点统计
文章
20
分类
7
标签
49
总字数
26,919
运行时长
0 天
最后活动
0 天前
文章目录