Obsidian 双重保险教程:Dropbox 同步 + GitHub 防灾备

为什么要这么做?

想象一下:

  1. Dropbox 是您的“搬运工”,负责帮您把笔记在电脑和手机之间搬来搬去(实时同步)。
  2. GitHub 是您的“时光机”。如果未来您用 AI 整理笔记时,AI 发疯删了您一半的文件,Dropbox 会老实地把这些删除同步到所有设备(灾难!)。但 GitHub 会保留昨天的版本,您可以随时“穿越回去”找回数据。

目标: 每天自动把笔记备份到 GitHub,且带有“熔断机制”(如果 AI 删太多文件,备份会自动停止报警)。


第一步:在云端建个“保险库” (GitHub)

我们要先在 GitHub 上申请一个存放笔记的地方。

  1. 登录 GitHub.com
  2. 点击右上角的 + 号,选择 New repository
  3. Repository name (仓库名):填 Obsidian-Backup
  4. Privacy (隐私):一定要选 Private (私有)!这是您的私人笔记。
  5. Initialize (初始化)什么都别勾选! (不要点 Add README file)。
  6. 点击绿色按钮 Create repository
  7. 创建好后,找到页面上的 SSH 按钮(通常在 Quick setup 区域),点击它,然后复制那个以 git@github.com... 开头的地址。先记在记事本里。

第二步:给电脑配把“钥匙” (配置 SSH)

为了让电脑自动备份不弹窗输密码,我们需要配一把“电子钥匙”。

1. 打开黑窗口:在电脑搜索栏输 cmd,回车打开“命令提示符”。

2. 告诉 Git 你是谁 (复制下面两行,把名字邮箱改成你的,右键粘贴进黑窗口,回车):

git config --global user.name "您的GitHub用户名"
git config --global user.email "您的GitHub注册邮箱"

3. 生成钥匙 (复制粘贴,一路按回车,不要设密码,直到结束):

ssh-keygen -t ed25519 -C "ObsidianKey"

4. 把钥匙给 GitHub

  • 在黑窗口输:clip < %userprofile%\.ssh\id_ed25519.pub (这会自动复制钥匙内容)。
  • 回到 GitHub 网页 -> 点击右上角头像 -> Settings -> 左侧 SSH and GPG keys
  • 点击绿色的 New SSH key
  • Title:随便填,比如 My PC
  • Key:粘贴刚才复制的一长串乱码。
  • 点击 Add SSH key

第三步:第一次手动“握手”

这一步必须做一次,脚本才能接手。

  1. 在黑窗口里,进入您的笔记文件夹:
cd /d "D:Dropbox\Obsidian"

  1. 依次执行下面这几行“咒语”(每行输完按回车):
git init
git branch -M main

  1. 关联仓库 (把下面地址换成第一步里您复制的那个 git@... 地址):
git remote add origin git@github.com:您的用户名/Obsidian-Backup.git

  1. 创建忽略名单 (防止 Dropbox 冲突文件干扰):
  • 打开您的 Obsidian 文件夹。
  • 新建一个文本文件,命名为 .gitignore. (注意前后都有点,系统会自动去掉最后的点)。
  • 用记事本打开它,粘贴以下内容并保存:
.obsidian/workspace.json
.obsidian/workspace-mobile.json
.obsidian/cache
.trash/
*conflicted copy*
Thumbs.db
  1. 首次推送 (这是唯一一次需要手动操作):
git add .
git commit -m "第一次人工备份"
git push -u origin main

(如果提示 Are you sure...,输 yes 回车)
看到 Branch 'main' set up to track... 就说明成功了!


第四步:部署“智能保镖” (Python 脚本)

这个脚本是核心,它会检查是不是删了太多文件,如果是,它会阻止备份。

  1. D:\Dropbox\ 这个目录下(不要放在 Obsidian 文件夹里面,放在外面一层),新建一个文本文档。
  2. 重命名为 Obsidian_Backup_Script.py (确保后缀是 .py 不是 .txt)。
  3. 右键 -> Edit with IDLE (或者用记事本打开),粘贴以下完整代码:
import subprocess
import os
import datetime
import sys

# ================= ⚙️ 这里是您的配置 =================
# 您的笔记库路径
VAULT_PATH = r"D:\Dropbox\Obsidian"

# 日志文件放在笔记库里,方便您随时看
LOG_FILE = os.path.join(VAULT_PATH, "backup_log.txt")

# 【安全阈值】
# 如果一天内删除了超过 5 个文件,或者总变动超过 50 个文件
# 脚本会认为是 AI 发疯了,自动停止备份,保留 GitHub 上的旧版本
DELETE_THRESHOLD = 5
CHANGE_THRESHOLD = 50
# ====================================================

def write_log(message):
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_str = f"[{timestamp}] {message}"
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(log_str + "\n")
    except:
        pass

def run_backup():
    if not os.path.exists(VAULT_PATH):
        return

    os.chdir(VAULT_PATH)

    try:
        # 1. 检查变动
        status_output = subprocess.check_output(
            ["git", "status", "--porcelain"], 
            text=True, 
            encoding='utf-8',
            stderr=subprocess.STDOUT
        )
        
        changes = [line for line in status_output.split('\n') if line.strip()]
        total_changes = len(changes)

        if total_changes == 0:
            write_log("✅ 无变动,跳过备份。")
            return

        # 2. 检查删除了多少文件
        deleted_count = 0
        for line in changes:
            if line.strip().startswith('D ') or line.strip().startswith('AD'):
                deleted_count += 1

        # 3. 熔断判定(安全检查)
        if deleted_count > DELETE_THRESHOLD:
            write_log(f"🛑 危险!检测到删除了 {deleted_count} 个文件。备份已强制中止!请检查。")
            return
        
        if total_changes > CHANGE_THRESHOLD:
            write_log(f"🛑 警告!检测到 {total_changes} 个大量变动。备份已中止。")
            return

        # 4. 执行备份
        date_str = datetime.datetime.now().strftime("%Y-%m-%d")
        subprocess.run(["git", "add", "."], check=True)
        subprocess.run(["git", "commit", "-m", f"Auto Backup: {date_str}"], check=True)
        subprocess.run(["git", "push", "origin", "main"], check=True)
        write_log(f"🚀 备份成功!同步了 {total_changes} 个变动。")

    except Exception as e:
        write_log(f"❌ 出错: {str(e)}")

if __name__ == "__main__":
    run_backup()


第五步:定个“闹钟” (Windows 计划任务)

最后,让 Windows 每天晚上自动运行这个脚本,并且不弹黑框

  1. 按键盘 Win + R,输入 taskschd.msc,回车。
  2. 点击右边的 “创建基本任务”
  3. 名称Obsidian Git Backup -> 下一步。
  4. 触发器每天 -> 下一步 -> 时间设为 22:00 (建议设在您用完 AI 之后) -> 下一步。
  5. 操作启动程序 -> 下一步。
  6. 配置详情 (这是重点!):
    • 程序或脚本:我们要用无窗口模式的 Python。请填入:
      pythonw.exe
      (如果系统提示找不到,请填完整路径,通常是 C:\Users\您的用户名\AppData\Local\Programs\Python\Python3x\pythonw.exe)
    • 添加参数:(填脚本的路径,记得加引号)
      "D:\Dropbox\Obsidian_Backup_Script.py"
    • 起始于:(填脚本所在的文件夹)
      D:\Dropbox\
  7. 点击 完成
  8. 最后微调
    • 在列表里双击这个任务。
    • 在“常规”里,确保勾选 “只在用户登录时运行” (这能保证它能读到您的 SSH 钥匙)。
    • 点击确定。

🎉 大功告成!如何验证?

明天早上,或者您现在手动右键任务点击“运行”后:

  1. 打开您的 Obsidian 笔记文件夹。
  2. 找一个叫 backup_log.txt 的文件。
  3. 如果看到 🚀 备份成功,恭喜您,您的数据现在有了实时同步 + 防灾历史的双重保护!

以后如果 AI 误删了文件,不要惊慌:

  1. 打开 backup_log.txt,您会看到 🛑 危险!检测到删除...,说明脚本成功拦截了错误的同步。
  2. GitHub 上的文件依然是安全的旧版本。