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

最近在优化本地写博客的多设备工作流。核心诉求非常纯粹:在 Typora 里写 Markdown 文章,写完后能一键自动同步推送到 GitHub 仓库做异地备份与多端协同(比如家里的 iMac 与随身的 MacBook 交替写作)。
一开始曾想过搞“保存即触发”的实时自动化脚本,但很快发现两个无法接受的硬伤:
- Typora 官方并未开放原生保存(Save Hook)动作钩子。
- 即使通过第三方文件监听(如
fswatch)实现,频繁按下Cmd + S就会生成海量零碎的 Commit,导致 Git 提交历史变成充斥着残缺片段的垃圾堆。
为了让同步动作完全可控、阶段性触发,同时保持 Git 提交历史干净线性,我盯上了 Typora 自带的「自定义导出」功能。
把“导出”当成一个手动的动作触发器(Action Trigger):写完一篇文章或阶段性收工时,点一下导出(或敲下快捷键),整个仓库便会在后台自动拉取远端、提交变动、推送 GitHub,并通过 macOS 弹窗反馈全过程。
一、 核心同步脚本编写(auto_push.sh)
第一步是在博客 Git 仓库根目录下新建一个名为 auto_push.sh 的 Shell 脚本。
为了解决多端同步时的冲突隐患以及缺乏即时反馈的“黑盒感”,脚本设计了两段式状态提示与冲突拦截保护机制:
#!/bin/bash
# 1. 强制切换到脚本所在仓库根目录,防止 Typora 在其他工作路径调用报错
cd "$(dirname "$0")" || exit
# 2. 自动获取当前分支名 (兼容 main 或 master)
CURRENT_BRANCH=$(git branch --show-current)
# 3. 检查是否有文件变动
if [ -n "$(git status --porcelain)" ]; then
# 步骤 1: 提交前发送开始提示(通知已启动多端同步流程)
osascript -e 'display notification "正在检查并拉取远端最新代码..." with title "Blog 正在同步 [1/2]"'
# 提交本地新内容
git add .
git commit -m "Typora sync: $(date +'%Y-%m-%d %H:%M:%S')"
# 步骤 2: 先拉取远程代码并变基(保持历史线性整洁)
if ! git pull --rebase origin "$CURRENT_BRANCH"; then
# 如果两端修改了同一文件产生冲突,立即中止并弹窗提醒
osascript -e 'display notification "与远端存在编辑冲突,已暂停推送,请手动解决" with title "⚠️ Blog 同步中断"'
exit 1
fi
# 留出 1 秒缓冲,避免 macOS 通知重叠,同时提供舒适的节奏反馈
sleep 1
# 步骤 3: 推送代码到 GitHub
if git push origin "$CURRENT_BRANCH"; then
# 成功时发送最终完成通知
osascript -e 'display notification "已拉取远端更新并成功发布至 GitHub" with title "✅ Blog 同步成功 [2/2]"'
echo "同步成功"
else
# 推送失败通知
osascript -e 'display notification "推送失败,请检查网络连接" with title "❌ Blog 推送失败"'
echo "推送失败"
fi
else
echo "无变更,无需同步"
fi
脚本赋予执行权限
脚本保存后,打开 macOS 终端,进入博客根目录赋予其可执行权限(这是 Typora 能否成功调起脚本的关键):
chmod +x auto_push.sh
二、 Typora 端详细配置步骤(保姆级实操)
脚本就绪后,需要将其挂载到 Typora 的菜单体系中。以下是单台电脑上的详细配置流程:
步骤 1:打开 Typora 偏好设置
- 打开 Typora,使用顶部菜单
Typora -> 设置...(或直接使用快捷键Cmd + ,)。 - 在左侧侧边栏中,点击切换到 「导出」(Export) 面板。
步骤 2:添加自定义导出项
- 滚动到右侧面板最下方的「自定义」(Custom Commands) 区域。
- 点击左下角的
+(添加)按钮,新建一个自定义导出配置。
步骤 3:填写配置参数
在弹出的配置表单中,按以下规范填写:
| 配置项 (Field) | 填写内容 | 说明与避坑指南 |
|---|---|---|
| 名称 (Name) | Git 同步 | 会直接显示在 Typora 顶部菜单 文件 -> 导出 的二级子菜单中 |
| 命令 (Command) | /Users/你的用户名/Documents/GitHubProjects/Blog/auto_push.sh | 必须填写绝对路径。可以直接将 auto_push.sh 文件从 Finder 拖拽到该输入框中自动填入完整路径 |
| 目标文件 (Target) | 留空 | 不需要填写任何内容 |
| 输出目录 (Output) | 留空 / 保持默认 | 不需要填写任何内容,所有文件由脚本全权管理 |
配置完成后,直接关闭偏好设置窗口,Typora 会自动保存配置并即时生效。
三、 多设备(如配置家中 iMac)迁移清单
当你在另一台电脑(例如家里的 iMac)上重新配置这套流程时,只需要按照以下 4 步走一遍:
- 拉取最新代码: 在 iMac 终端上克隆或拉取博客仓库最新的
main分支(此时仓库内已有写好的auto_push.sh)。 - 确认执行权限: 在 iMac 终端进入博客根目录,执行一次:
chmod +x auto_push.sh - 获取 iMac 本机脚本绝对路径: 在 iMac 终端运行
pwd,例如输出/Users/Carl/Documents/GitHubProjects/Blog,则该机器上的脚本绝对路径为/Users/Carl/Documents/GitHubProjects/Blog/auto_push.sh。 - 在 iMac 的 Typora 中配置自定义导出: 打开 iMac 上的 Typora 设置 ->「导出」-> 添加自定义项,名称填
Git 同步,命令填入步骤 3 获取的 iMac 绝对路径即可。 - 首次手动连通性验证: 在 iMac 终端中先手动执行一次
./auto_push.sh,确保 iMac 已配置好 GitHub SSH Key 或 Git 凭证,能够无弹窗顺利推送。
四、 进阶技巧:绑定 macOS 全局快捷键
每次写完文章如果都要用鼠标去点 文件 -> 导出 -> Git 同步 还是略显繁琐。我们可以利用 macOS 系统级功能为其绑定专属快捷键:
- 打开 macOS 「系统设置」 (System Settings)。
- 依次进入 「键盘」 -> 「键盘快捷键…」 -> 「App 快捷键」。
- 点击底部的
+按钮:- 应用程序:选择
Typora。 - 菜单标题:精确输入
Git 同步(必须与 Typora 导出里的名称完全一致)。 - 键盘快捷键:按下你想设置的组合键(推荐
Cmd + Shift + S或Cmd + Ctrl + S)。
- 应用程序:选择
- 点击完成。
配置完成后,在 Typora 写作中只要按下设定的快捷键,系统就会自动执行全套 Git 同步并弹出进度通知!

五、 核心设计总结
- 动静分离,拒绝垃圾日志:平时的常规保存(
Cmd + S)仅写入本地文件;阶段性写完后使用自定义导出(Git 同步)一次性完成异地备份与发布。 - Rebase 保证线性历史:多台设备交替写作时,脚本在
push前会自动执行git pull --rebase,远端更新会被无缝合并在最底层,杜绝多余的 Merge Commit 节点。 - 两段式通知机制:
[1/2]明确告知已开始检查拉取远端,[2/2]确认最终推送到 GitHub,中间 1 秒节奏缓冲防止通知闪退,让多端同步完全透明可靠。