同步方案

方案1:fswatch 实时监控

  • 特点:一修改文件就立刻同步发布
  • 缺点:太频繁!你改一个字就发布一次,浪费资源
  • 适合:需要实时更新的场景

方案2:crontab 定时发布

  • 特点:每天固定时间发布一次
  • 缺点:需要一直开机,关机就不会运行
  • 适合:Mac 经常开机的情况

方案3:Git 配合 GitHub Actions ⭐️ 最推荐

  • 特点:用 Git 管理文档,推送到 GitHub 后自动发布
  • 优点:
    • 不需要 Mac 一直开机
    • 有版本控制,可以回退
    • 更专业,更稳定
    • 想发布时手动 push 一下即可
  • 适合:所有场景 已完成方案一,有时间再继续鼓捣鼓捣方案三

问了ai很快给出了方案,没有理由偷懒了-.-//

2025-11-21 我发现一个命令可以一次执行就完成同步两个本地仓库,并且发布,然后设置定时自动运行该命令就可以了,最终选择了方案三,第一次尝试的时候死活不成功,这次很快就成功了,果然过于死磕并不是好事

监听工具对比

工具推荐度优点适合情况
chokidar-cli⭐⭐⭐⭐⭐轻量、跨平台、Quartz 标配最推荐
fswatch⭐⭐⭐⭐mac 下性能最强Mac 用户
nodemon⭐⭐⭐日志清晰需要日志的人
Syncthing⭐⭐⭐⭐不写代码、自动同步只想同步文件

方案三

1.fswatch安装

# 安装
brew install fswatch
 
# 确认安装
fswatch --version
 

2.初始化 Git 仓库

cd /Users/jz/quartz
git init
git add .
git commit -m "initial commit"

3.连接到GitHub

# 如果之前已经做过这些操作就不用重复
git remote add origin https://github.com/你的用户名/my-quartz.git
git branch -M main
git push -u origin main

4.创建快速发布脚本

nano ~/github-push.sh

粘贴(仓库地址改为自己的)

#!/bin/bash
 
# 设置环境变量,让 cron 能找到 npx ,提示找不到npx,但是能发布成功,下次再试试,如果一直成功就不改了
export PATH="/usr/local/bin:$PATH"
 
# 先同步 Obsidian 文件到 Quartz
OBSIDIAN_VAULT="/Users/jz/Library/Mobile Documents/iCloud~md~obsidian/Documents/all-in/2.Read"
QUARTZ_CONTENT="/Users/jz/quartz/content/2.Read"
# Quartz 项目根目录
QUARTZ_DIR="/Users/jz/quartz"
 
echo "$(date): 开始同步" 
cp -r "$OBSIDIAN_VAULT"/* "$QUARTZ_CONTENT/"
 
# 进入 Quartz 目录
cd "$QUARTZ_DIR"
 
# Git 提交并推送
echo "提交到 Git..."
git add .
git commit -m "update $(date +%Y-%m-%d-%H:%M)"
git push
 
echo "发布到线上..."
npx quartz sync --no-pull
 
echo "完成!"

只会把同名的文件替换,不会删除不同的文件

5.赋予执行权限

chmod +x ~/github-push.sh

6.手动发布

~/github-push.sh

7.定时自动发布

crontab

# 临时编辑器
EDITOR=nano crontab -e
# 每分钟执行
* * * * * /bin/bash ~/github-push.sh >> ~/cron-test.log 2>&1
  
  # 选择适合的自动发布时间
**每天上午10点执行:** 
 0 10 * * * /bin/bash ~/github-push.sh >> ~/cron-test.log 2>&1
**每两天上午10点执行:**
 0 10 */2 * * /bin/bash ~/github-push.sh >> ~/cron-test.log 2>&1
**每周四上午10点执行:**
0 10 * * 4 /bin/bash ~/github-push.sh >> ~/cron-test.log 2>&1
 
# 查看日志
cat ~/cron-test.log
# 清空日志
> ~/cron-test.log

常用命令

 
# 编辑当前用户的定时任务
crontab -e
 
# 查看当前用户的定时任务
crontab -l
 
# 删除当前用户的所有定时任务
crontab -r
 
# 编辑指定用户的定时任务(需要 root 权限)
sudo crontab -u username -e

方案一

windows版

2.使用

obsidian路径:/Users/jz/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/all\ in/2.Read quartz路径:/Users/jz/quartz/content/2.Read

2.1创建一个自动化脚本

打开终端, (创建一个文本文件)

nano ~/sync-quartz.sh

把下面的内容复制粘贴进去:

#!/bin/bash
 
# Obsidian 路径(iCloud 同步的)
OBSIDIAN_VAULT="/Users/jz/Library/Mobile Documents/iCloud~md~obsidian/Documents/all-in/2.Read"
 
# Quartz 内容路径
QUARTZ_CONTENT="/Users/jz/quartz/content/2.Read"
 
# Quartz 项目根目录
QUARTZ_DIR="/Users/jz/quartz"
 
# 记录日志
echo "$(date): 开始同步" >> ~/quartz-sync.log
 
# 复制文件到 Quartz
cp -r "$OBSIDIAN_VAULT"/* "$QUARTZ_CONTENT/"
 
# 进入 Quartz 目录并发布
cd "$QUARTZ_DIR"
npx quartz sync --no-pull
 
echo "$(date): 同步完成" >> ~/quartz-sync.log

windows:按 Ctrl + X,然后按 Y,再按回车保存 mac:按 control + X,然后按 Y,再按回车保存

2.2让脚本可以运行

chmod +x ~/sync-quartz.sh

2.3手动测试一次

~/sync-quartz.sh

2.4设置每天自动运行

crontab -e
 
# (每天晚上2点)运行:
0 2 * * * /Users/jz/sync-quartz.sh

保存退出(Ctrl+X, 然后 Y, 然后回车) 输入crontab -e看不到选项/进入后不能编辑时

# 输入crontab -e看不到选项时
export EDITOR=nano
 

mac版可以用launchd

不建议设置太多,其实用crontab就差不多了,不然不好管理

1. 创建 launchd 配置文件

nano ~/Library/LaunchAgents/com.user.sync-quartz.plist

2.粘贴配置内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.sync-quartz</string>
 
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/jz/sync-quartz.sh</string>
    </array>
 
    <!-- 每天凌晨2点运行 -->
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>2</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
 
    <!-- 日志文件 -->
    <key>StandardOutPath</key>
    <string>/Users/jz/logs/sync-quartz.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/jz/logs/sync-quartz-error.log</string>
 
    <!-- 即使上次运行失败也继续运行 -->
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>

3.创建日志目录

mkdir -p ~/logs

4.加载并启动任务

# 加载任务
launchctl load ~/Library/LaunchAgents/com.user.sync-quartz.plist
 
# 检查是否加载成功
launchctl list | grep sync-quartz

5.立即运行测试

# 手动触发一次
launchctl start com.user.sync-quartz
 
# 查看日志
cat ~/logs/sync-quartz.log
cat ~/logs/sync-quartz-error.log

6.定时运行

<!-- 每小时运行 -->
<key>StartInterval</key>
<integer>3600</integer>
 
<!-- 或者每天多次运行(早8点和晚8点) -->
<key>StartCalendarInterval</key>
<array>
    <dict>
        <key>Hour</key>
        <integer>8</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <dict>
        <key>Hour</key>
        <integer>20</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</array>

常用命令

# 停止任务
launchctl stop com.user.sync-quartz
 
# 卸载任务
launchctl unload ~/Library/LaunchAgents/com.user.sync-quartz.plist
 
# 重新加载(修改配置后)
launchctl unload ~/Library/LaunchAgents/com.user.sync-quartz.plist
launchctl load ~/Library/LaunchAgents/com.user.sync-quartz.plist
 
# 查看当前用户的所有任务 
launchctl list | wc -l
 
# 查看任务状态
launchctl list | grep sync-quartz
 
# 启动任务(立即执行一次)
launchctl start com.example.myscript
 
# 停止任务
launchctl stop com.example.myscript
 
# 查看所有已加载的任务
launchctl list
 
# 查看特定任务状态
launchctl list | grep com.example
 
# 查看任务详细信息
launchctl print gui/$(id -u)/com.example.myscript
 
# 移除任务
launchctl remove com.example.myscript