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

最近在优化本地写博客的工作流。主要需求很简单:在 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 垃圾日志。平时敲字就专心敲,写完阶段性收工时点一次导出,干净利落。对于静态博客或个人笔记站来说,折腾到这个程度也就足够顺手了。