Appearance
知识库:Mac 使用 launchd 自动同步 Git 仓库
本文档归档当前笔记仓库在 macOS 上的自动同步方案,重点包括:为什么选择 launchd、自动任务的文件结构、每日 16:50 自动提交推送的执行逻辑,以及 opencode 生成 commit message 的接入方式。
1. 目标
目标是在当前这台 Mac 上,为仓库 blog-article 增加一个系统级自动任务,实现每天固定时间自动:
git add -Agit commitgit push
对应仓库路径:/Users/util6/Documents/blog-article
2. 采用的技术链路
最终采用的是 macOS 原生的 launchd 方案。
使用的是:
launchdLaunchAgentlaunchctl
而不是:
cron- Automator
- 快捷指令自动化
原因是:
launchd是 macOS 官方后台任务方案。- 更适合图形桌面用户会话。
- 对这种每天固定时间执行一次的 Git 脚本足够稳定。
需要注意:这个任务虽然是系统原生能力,但它不显示在“快捷指令”App 中,因为它属于 launchd / LaunchAgent 后台任务,而不是 Shortcuts 自动化。
3. 已落地的文件
脚本文件:
~/Library/Application Support/blog-article-sync/auto-sync.sh
任务配置文件:
~/Library/LaunchAgents/com.util6.blog-article-auto-sync.plist
日志目录:
~/Library/Logs/blog-article-sync/
4. 任务执行时间
任务被配置为每天:
16:50
对应的 plist 关键配置示例:
xml
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>16</integer>
<key>Minute</key>
<integer>50</integer>
</dict>5. 自动化脚本的执行逻辑
脚本会按下面顺序执行:
- 检查仓库目录是否存在。
- 检查当前分支是否为
master。 - 检查是否存在
index.lock、merge、rebase 等冲突状态。 - 执行
git add -A。 - 若无暂存改动则退出。
- 调用
opencode run --format json生成 commit message。 - 若生成失败,则回退为
自动同步 YYYY-MM-DD HH:MM:SS。 - 执行
git commit -m ...。 - 执行
git push origin master。
由于当前 origin 带有多个 push URL,所以这个自动任务会沿用已有的多远端推送行为。
6. 为什么接入 opencode
检查本机 opencode 后,确认它支持可脚本化 CLI:
opencode run [message..]opencode run --format json
这说明它不是只能跑交互式 TUI,而是可以嵌入 shell 脚本,作为 commit message 生成器使用。
最终接入策略是:
- 优先调用
opencode生成更自然的中文提交信息。 - 调用失败时自动回退到固定时间戳消息。
这样既保留了自动化的稳定性,也提高了自动提交信息的可读性。
7. 如何确认任务已经存在
可以通过下面的命令查看:
bash
launchctl list | rg blog-article如果能看到:
text
com.util6.blog-article-auto-sync就说明该用户级任务已经被 launchd 加载。
此外,也可以直接查看:
~/Library/LaunchAgents/com.util6.blog-article-auto-sync.plist~/Library/Logs/blog-article-sync/run.log
8. 启停方式
停用任务:
bash
launchctl unload ~/Library/LaunchAgents/com.util6.blog-article-auto-sync.plist重新启用任务:
bash
launchctl load ~/Library/LaunchAgents/com.util6.blog-article-auto-sync.plist9. 当前方案的优点与风险
9.1 优点
- 使用 macOS 原生后台调度能力。
- 不依赖第三方定时器。
- 自动任务结构简单,容易排查问题。
- 可以复用
opencode生成更自然的提交说明。
9.2 风险
- 自动任务会提交当时工作区中的所有改动,而不是只提交部分文件。
- 如果某天工作区里存在不想提交的临时改动,自动任务也可能一起提交。
- 如果远程有冲突、认证失效或者网络异常,自动推送会失败,需要看日志排查。
10. 后续可选增强
如果后续要继续迭代,可以在现有 launchd + shell + opencode 结构上继续增强,例如:
- 只自动提交
.md。 - 排除图片目录或其他特定路径。
- 提交前自动
git pull --rebase。 - 成功或失败时发送 macOS 通知。
- 在提交前增加更严格的文件筛选规则。
对于当前个人知识库仓库来说,现有方案已经足够实用,重点在于后续是否要进一步缩小“自动任务会把所有改动一起提交”的风险面。