记录一次 Typora 博客同步流改造:如何实现随时备份,又不让 Git 提交记录变成垃圾堆

截屏2026-08-13 12.36.07

最近在优化本地写博客的工作流。主要需求很简单:在 Typora 里写 Markdown,写完自动推送到 GitHub 的仓库里做备份和同步。

一开始想过搞个“保存即触发”的脚本,但很快发现两个问题。首先 Typora 并没有开放保存动作的钩子;其次,就算能做到,每次按下 Command + S 都会生成一个 Commit,Git 历史里全是零碎的无意义记录,看着太脏了。

为了让同步变得可控,同时保持 Git 提交历史干净,我盯上了 Typora 的“自定义导出”功能。把导出操作当成一个手动的同步触发器来用,写完一篇文章,点一下导出,整个仓库自动提交并推送。

这里记录一下折腾的过程,方案够用且复现简单。

准备同步脚本

第一步是写个能在终端里完成 Git 提交全家桶的 Bash 脚本。直接在 Git 仓库的根目录下新建一个文件 auto_push.sh

#!/bin/bash
# 切换到脚本所在目录,防止 Typora 在其他工作路径调用报错
cd "$(dirname "$0")" || exit

# 自动适配分支名
CURRENT_BRANCH=$(git branch --show-current)

# 检查是否有文件变动
if [ -n "$(git status --porcelain)" ]; then
    git add .
    git commit -m "Typora sync: $(date +'%Y-%m-%d %H:%M:%S')"
    
    # 强制 rebase 拉取,避免多台设备编辑时产生冲突节点
    git pull --rebase origin "$CURRENT_BRANCH"
    
    # 执行推送并调用 macOS 系统弹窗
    if git push origin "$CURRENT_BRANCH"; then
        osascript -e 'display notification "Markdown 笔记已成功同步到 GitHub" with title "Blog Git 同步成功"'
    else
        osascript -e 'display notification "请检查网络或 Git 冲突" with title "Blog Git 同步失败"'
    fi
fi

保存后,切到终端里顺手给它加上执行权限,这一步必不可少,否则 Typora 调不动它:

chmod +x auto_push.sh

Typora 端配置

脚本准备好后,需要把它挂载到 Typora 里。

打开 Typora 偏好设置,进入“导出”选项卡,点击右上角的加号,新建一个“自定义”导出格式。具体配置项见下表:

配置参数填写建议作用说明
名称Git 同步会在 Typora 的导出菜单里直接显示
命令 (Command)/绝对路径/auto_push.sh必须填脚本的绝对路径,例如 /Users/xxx/Blog/auto_push.sh

配好之后关闭偏好设置窗口即可生效。

以后写完文章,依次点击顶部菜单:文件 -> 导出 -> Git 同步。稍等两秒,屏幕右上角就会弹出同步成功的系统通知。

踩坑与注意点

在实际测试里,这套流程跑下来有几个细节需要注意:

  • 记得加 Pull:一开始的脚本偷懒没写 git pull。如果你在公司电脑改了点东西推上去了,回家直接触发这个脚本,因为本地落后于远程分支,Push 会直接报错失败。加上 git pull --rebase 能省去很多麻烦,还能保持一条直线的干净历史。
  • 全局提交特性:脚本里用的是 git add .。这意味着当你点击导出时,它推送的不是你当前正在写的这单篇 Markdown,而是整个博客仓库里所有变动过的文件。这其实是更合理的逻辑,你顺手改的 CSS 样式或者刚贴进去的图片,都会跟着这次同步一起打包推上去。
  • 系统通知是刚需:Typora 的自定义导出是完全静默执行的,如果脚本在后台因为网络原因断了,你是完全不知道的。利用 macOS 自带的 osascript 挂一个系统通知,能给这个简陋的自动化流程提供最直接的反馈。

总结

这套方案算是巧妙利用了 Typora 的机制盲区。把“导出”当“动作”用,既实现了随时备份,又规避了过度同步导致的 Git 垃圾日志。平时敲字就专心敲,写完阶段性收工时点一次导出,干净利落。对于静态博客或个人笔记站来说,折腾到这个程度也就足够顺手了。