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

截屏2026-08-13 12.36.07

最近在优化本地写博客的多设备工作流。核心诉求非常纯粹:在 Typora 里写 Markdown 文章,写完后能一键自动同步推送到 GitHub 仓库做异地备份与多端协同(比如家里的 iMac 与随身的 MacBook 交替写作)。

一开始曾想过搞“保存即触发”的实时自动化脚本,但很快发现两个无法接受的硬伤:

  1. Typora 官方并未开放原生保存(Save Hook)动作钩子。
  2. 即使通过第三方文件监听(如 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 步走一遍:

  1. 拉取最新代码: 在 iMac 终端上克隆或拉取博客仓库最新的 main 分支(此时仓库内已有写好的 auto_push.sh)。
  2. 确认执行权限: 在 iMac 终端进入博客根目录,执行一次:
    chmod +x auto_push.sh
    
  3. 获取 iMac 本机脚本绝对路径: 在 iMac 终端运行 pwd,例如输出 /Users/Carl/Documents/GitHubProjects/Blog,则该机器上的脚本绝对路径为 /Users/Carl/Documents/GitHubProjects/Blog/auto_push.sh
  4. 在 iMac 的 Typora 中配置自定义导出: 打开 iMac 上的 Typora 设置 ->「导出」-> 添加自定义项,名称填 Git 同步,命令填入步骤 3 获取的 iMac 绝对路径即可。
  5. 首次手动连通性验证: 在 iMac 终端中先手动执行一次 ./auto_push.sh,确保 iMac 已配置好 GitHub SSH Key 或 Git 凭证,能够无弹窗顺利推送。

四、 进阶技巧:绑定 macOS 全局快捷键

每次写完文章如果都要用鼠标去点 文件 -> 导出 -> Git 同步 还是略显繁琐。我们可以利用 macOS 系统级功能为其绑定专属快捷键:

  1. 打开 macOS 「系统设置」 (System Settings)。
  2. 依次进入 「键盘」 -> 「键盘快捷键…」 -> 「App 快捷键」
  3. 点击底部的 +按钮:
    • 应用程序:选择 Typora
    • 菜单标题:精确输入 Git 同步(必须与 Typora 导出里的名称完全一致)。
    • 键盘快捷键:按下你想设置的组合键(推荐 Cmd + Shift + SCmd + Ctrl + S)。
  4. 点击完成。

配置完成后,在 Typora 写作中只要按下设定的快捷键,系统就会自动执行全套 Git 同步并弹出进度通知!

截屏2026-08-25 11.58.31

五、 核心设计总结

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