Typora的多端同步方案,如何多台计算机共享md文件?Windows和Mac通过定时执行git来同步markdown文件

Windows和Mac通过定时执行git来同步markdown文件。
在阅读文章前,务必给typora配好图床,图床真的很爽,去网上搜搜教程二十分钟配好。

配置git免密码推拉

首先需要给git配置免登录,使用ssh推拉代码。如果不想看废话,请看标准执行流程

ssh-keygen -t ed25519 -C "your_email@example.com"其中,邮箱地址只是一个标识,默认会在Mac上的/Users/zhangyongle/.ssh/id_ed25519保存(隐藏目录,使用cmd+shift+.显示)

若没有使用默认的路径,需要手动将生成的ssh密钥加载。

ssh-add /path/to/your/custom_key  # 替换为你的密钥实际路径,如 ~/.ssh/my_key

或者指定密钥路径

ssh -i /path/to/your/custom_key

标准执行流程:

ssh生成密钥

ssh-keygen -t rsa

记录密钥,打开生成的.pub文件,拷贝(在生成密钥的时候会有生成文件的地址)

image-20251022091809903

然后就可以通过git访问仓库了。

下面来分别介绍Mac和Windows定时脚本的方案(经过完整执行的)

Windows定时执行脚本

编写一个bat脚本,注意路径中不要有中文。该脚本实现如果有变更,则提交代码,无变更则不提交。请注意修改脚本中的仓库路径和日志目录(注意不要放到一起,否则每次运行脚本都要产生日志,每次有日志变更就又要交代码。。检测变更就没有了意义)

@echo off
chcp 65001 >nul 2>&1

:: 配置路径(仓库路径和日志目录)
set "REPO_PATH=F:\repository\typora-synchronization"
set "LOG_DIR=F:\tool\script\log"
set "LOG_FILE=%LOG_DIR%\git_sync.log"

:: 确保日志目录存在(不存在则创建)
if not exist "%LOG_DIR%" (
    md "%LOG_DIR%" >nul 2>&1
)

:: 获取当前时间
set "NOW=%date:~0,10% %time:~0,8%"

:: 记录执行开始
echo [%NOW%] 脚本开始执行 >> "%LOG_FILE%"

:: 切换到仓库目录
cd /d "%REPO_PATH%" || (
    echo [%NOW%] 错误:无法切换到仓库目录 "%REPO_PATH%" >> "%LOG_FILE%"
    exit /b 1
)

:: 拉取远程代码
git pull >nul 2>&1
echo [%NOW%] git pull 执行完成 >> "%LOG_FILE%"

:: 检查工作区是否有变更(未执行add前)
git diff --quiet --exit-code
if %errorlevel% equ 0 (
    :: 无任何变更,直接结束
    echo [%NOW%] 工作区无变更,无需提交和推送 >> "%LOG_FILE%"
) else (
    :: 有变更:添加到暂存区并提交推送
    git add . >nul 2>&1
    git commit -m "Windows自动提交 [%NOW%]" >nul 2>&1
    git push >nul 2>&1
    echo [%NOW%] 检测到变更,已执行 add/commit/push >> "%LOG_FILE%"
)

:: 记录执行结束
echo [%NOW%] 脚本执行结束 >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"  :: 空行分隔每次执行

可以双击测试脚本能否成功运行,若不能,可以通过在脚本最后一行加pause来查看报错信息。

打开Windows任务计划程序,点击右边的新建任务

image-20251022105811799

image-20251022105815021

然后添加触发器和操作来自定义操作。触发器选择每半小时执行一次,持续时间为1天。

image-20251022110452784

触发器设置关机时运行(未验证)

image-20251022114318067

可以通过点击任务计划程序的右侧,”运行“来测试能否正常执行。

Mac 定时执行脚本

使用launchd启用定时任务,首先通过 .plist 格式的配置文件定义任务,文件需放在以下目录之一:

  • ~/Library/LaunchAgents/:当前用户的定时任务(推荐,无需管理员权限)
  • /Library/LaunchAgents/:所有用户的定时任务(需管理员权限)
  • /Library/LaunchDaemons/:系统级别的定时任务(需管理员权限,无用户交互)

首先创建一个sh脚本(不知道为什么mac的git在没有变更的情况下不会推代码,而Windows会推,可能是我的版本问题,总之不需要做特殊处理了)

cd 存放
git pull
git add .
git commit -m "sync at $(date +'%Y-%m-%d %H:%M:%S')"
git push

去mac设置里,找到“隐私与安全性”/“完全磁盘访问权限”,添加bin/sh的权限。(关键一步)

image-20251022212509183

创建一个md_sync.plist文件,规则可以去问一下ai或者百度一下,不再赘述。

<?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>md_sync</string>
    
    <!-- 要执行的脚本路径(绝对路径) -->
    <key>ProgramArguments</key>
    <array>
        <string>/Volumes/lyle/misc/script/md_sync.sh</string>  <!-- 脚本绝对路径 -->
    </array>
    
    <!-- 定时规则(使用 cron 风格或 launchd 特有格式) -->
    <key>StartCalendarInterval</key>
    <dict>
        <key>Minute</key>
        <integer>10</integer>
    </dict>
    1
    <!-- 输出日志路径(可选,方便调试) -->
    <key>StandardOutPath</key>
    <string>/Volumes/lyle/misc/script/script_output.log</string>
    <key>StandardErrorPath</key>
    <string>/Volumes/lyle/misc/script/script_error.log</string>
    
    <!-- 是否在加载时立即执行一次(可选) -->
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>

执行下面的命令加载

launchctl load md_sync.plist # plist文件存放路径

手动执行,测试是否可以成功提交

launchctl start md_sync 
posted @ 2025-10-22 21:28  压中  阅读(80)  评论(0)    收藏  举报