本页目录

知识星球导出文件怎么自动异地备份?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.nameuser.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 和工作流配置里不出现任何令牌明文;
  • 星球内容转手或到期后,备份仓库里的历史提交也需要一并处理,仅删除最新文件不会清除历史。

延伸阅读

使用边界:私有仓库仍然要求妥善保管访问权限;单文件超过 100 MB 无法直接推送;付费内容不应推送到公开仓库

常见问题

为什么要备份导出文件本身?

星球内容导出之后,文件通常只存在于同一块硬盘上。硬盘损坏或误删除时,导出做得再完整也会一起丢失,异地副本是必要的。

用 GitHub 存备份安全吗?

私有仓库只有你和你授权的协作者能访问,配合两步验证和细粒度访问令牌,适合个人资料备份。涉及付费的内容不要使用公开仓库。

GitHub Actions 能直接连到我的电脑取文件吗?

不能。Actions 运行在 GitHub 的服务器上,访问不到本地硬盘。本地同步由计划任务负责,Actions 负责监控备份是否按时到达。