知识星球导出文件怎么自动异地备份?Windows 计划任务加 GitHub 私有仓库
- 适用范围
- 已经能用知识星球备份工具导出内容,希望导出文件获得异地备份和版本历史的 Windows 用户
- 信息来源
- 极拓工坊知识星球备份工具导出流程;Windows 计划任务与 GitHub Actions 公开文档
把知识星球内容导出到本地,只是备份的一半。导出文件通常留在同一块硬盘上,硬盘故障或误删除会让所有导出成果一起丢失。这篇文章解决另一半:用 Windows 计划任务把导出目录定时提交到 GitHub 私有仓库,让每一次导出都留下版本历史和异地副本;再用一个 GitHub Actions 定时任务监控备份新鲜度,超过三天没有新备份就发邮件提醒。
这套方案分成两层,各自解决一个问题:
- 本地层:计划任务定时运行同步脚本,导出目录有变化就自动提交并推送;
- 云端层:Actions 定时检查仓库里最近一次备份的时间,超期就让工作流失败,GitHub 会给仓库所有者发送邮件。
先说清楚一个边界:GitHub Actions 运行在 GitHub 的服务器上,访问不到本地硬盘,所以「定时从电脑取文件」这件事只能由本地的计划任务完成,Actions 承担的是监控和告警。了解这个分工后,两层各自的配置都很简单。
第一步:准备一个私有仓库
在 GitHub 上新建一个仓库,可见性选择 Private。这个仓库专门存放导出文件,不要用它存放代码,也不要改成公开——星球内容包含付费资料,公开仓库等于把它们分发给了所有人。
本地克隆这个仓库,例如克隆到 D:\zsxq-backup-vault。之后把知识星球备份工具的导出目录指到这个文件夹里,或者每次导出后把文件复制进来。导出和整理的方法见知识星球怎么完整备份。
两个限制需要提前知道:GitHub 单个文件超过 100 MB 无法直接推送,视频和音频较多的星球应先看一眼文件大小,超限的文件单独存放到其他位置;仓库总体积建议控制在几个 GB 以内,超过后克隆和推送都会变慢。
第二步:自动提交脚本
在 D:\zsxq-backup-vault 里新建 sync.ps1,内容如下:
$ErrorActionPreference = "Stop"
Set-Location "D:\zsxq-backup-vault"
git add -A
if (-not (git diff --cached --quiet)) {
$stamp = Get-Date -Format "yyyy-MM-dd HH:mm"
git commit -m "backup: $stamp"
git push origin main
Write-Output "backup pushed at $stamp"
} else {
Write-Output "no changes, skip"
}
脚本只做三件事:把目录里的全部变化加入暂存区;有变化就提交并推送,没有变化就直接退出。提交信息带时间戳,方便之后按时间找回某一版文件。
在 PowerShell 里手动运行一次 .\sync.ps1,确认能正常推送到 GitHub。第一次使用如果提示身份未配置,按提示设置 git config --global user.name 和 user.email,并准备好对私有仓库有读写权限的凭据(HTTPS 配合凭据管理器,或 SSH 密钥)。
第三步:注册 Windows 计划任务
以管理员身份打开 PowerShell,执行:
schtasks /Create /TN "ZsxqBackupSync" /TR "powershell -NoProfile -ExecutionPolicy Bypass -File D:\zsxq-backup-vault\sync.ps1" /SC DAILY /ST 21:30
这条命令创建名为 ZsxqBackupSync 的计划任务,每天 21
/SC DAILY /ST 21:30 控制频率和时间,希望每天运行两次就再建一条不同时间点的任务。
验证方法:打开「任务计划程序」,找到 ZsxqBackupSync,右键运行,然后到 GitHub 仓库页面确认出现了新的提交。
第四步:Actions 监控备份新鲜度
在仓库里新建 .github/workflows/backup-watch.yml:
name: backup-watch
on:
schedule:
- cron: "0 2 * * *"
workflow_dispatch:
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 最后一次备份是否超过 3 天
run: |
LAST=$(git log -1 --format=%ct)
NOW=$(date +%s)
AGE=$(( (NOW - LAST) / 86400 ))
echo "last backup was ${AGE} day(s) ago"
if [ "$AGE" -ge 3 ]; then
echo "::error::backup is stale (${AGE} days)"
exit 1
fi
工作流每天 UTC 时间 2 点(北京时间上午 10 点)运行一次,也可以在 Actions 页面手动触发。它读取仓库最后一次提交的时间,超过三天就在日志里报错并让工作流失败。
告警不需要额外配置:GitHub 默认会给仓库所有者发送工作流失败的邮件。也就是说,只要连续三天本地没有推送过任何备份,你的邮箱就会收到提醒——这可能意味着计划任务停了、导出中断,或者电脑长期没有开机。
fetch-depth: 0 用来获取完整提交历史,保证 git log 能取到时间;如果仓库历史增长后检出变慢,可以改用 API 读取默认分支最新提交的时间,效果相同。
恢复文件的时候
版本历史在这个方案里不只是安心剂。需要找回某一版内容时,有两种做法:
# 浏览某一天之后的全部变更
git log --since="2026-08-01" --oneline
# 把某个文件恢复到指定提交的版本
git checkout 3f2a1bd -- "zsxq/星球场/2026-07-15-主题帖.md"
误删除、覆盖或想对比两个时间点的内容,都可以通过提交历史完成。这也是用 Git 仓库做备份介质、而不是简单网盘同步的原因:网盘只有最新一版,Git 保留了每一版。
安全清单
- 仓库保持 Private,付费内容不进公开仓库;
- GitHub 账号开启两步验证,本地凭据使用细粒度访问令牌并限制仓库范围;
sync.ps1和工作流配置里不出现任何令牌明文;- 星球内容转手或到期后,备份仓库里的历史提交也需要一并处理,仅删除最新文件不会清除历史。
延伸阅读
- 知识星球怎么完整备份?帖子、评论、图片、视频和音频导出教程:导出层的完整流程;
- 知识星球新帖子自动监控与多平台通知:让新内容及时进入导出队列;
- 知识星球内容怎么导入 AI 知识库?:备份之后的进阶用法。
使用边界:私有仓库仍然要求妥善保管访问权限;单文件超过 100 MB 无法直接推送;付费内容不应推送到公开仓库
常见问题
为什么要备份导出文件本身?
星球内容导出之后,文件通常只存在于同一块硬盘上。硬盘损坏或误删除时,导出做得再完整也会一起丢失,异地副本是必要的。
用 GitHub 存备份安全吗?
私有仓库只有你和你授权的协作者能访问,配合两步验证和细粒度访问令牌,适合个人资料备份。涉及付费的内容不要使用公开仓库。
GitHub Actions 能直接连到我的电脑取文件吗?
不能。Actions 运行在 GitHub 的服务器上,访问不到本地硬盘。本地同步由计划任务负责,Actions 负责监控备份是否按时到达。