macOS 菜单栏 Git 同步工具 —— 一键管理多个 GitHub 仓库的本地同步
GitSync 是一个运行在 macOS 菜单栏的轻量级工具,帮助你自动管理和同步多个 Git/GitHub 仓库。无需打开终端或 IDE,即可完成 pull、push、rebase 等常见操作。
- 菜单栏常驻:随时查看和操作所有项目,不占用 Dock 栏位
- 智能同步:自动检测本地/远端变更,选择最优同步策略
- 仅远端更新 →
pull --rebase - 仅本地变更 → 自动
commit+push - 双方变更 →
commit→rebase→push - 冲突检测与报告
- 仅远端更新 →
- 自动定时同步:可配置 1/5/15/60 分钟间隔,支持暂停/恢复
- 系统通知:同步完成、冲突、错误的 macOS 原生通知
- 网络感知:断网自动暂停同步,网络恢复自动继续
- GitHub 集成:
- 一键添加仓库(输入 URL 自动解析)
- 非自有仓库自动 Fork
- Token 安全存储于 Keychain
- 同步历史:记录每次操作的类型、结果、耗时、commit hash
- 项目管理:搜索、排序、批量同步
- 快捷操作:在 Finder/终端中打开、复制 GitHub URL
- 数据持久化:配置和历史以 JSON 存储于
~/Library/Application Support/GitSync/
菜单栏弹出窗口,显示项目列表和同步状态:
┌─────────────────────────────┐
│ 🔍 搜索项目... │
├─────────────────────────────┤
│ ✅ MyRepo 3 分钟前 │
│ ⬇️ SomeLib 1 小时前 │
│ ⚠️ Conflict 冲突 │
├─────────────────────────────┤
│ [全部同步] [设置] [退出]│
└─────────────────────────────┘
项目详情视图,显示同步状态、本地变更和操作按钮。
- 前往 Releases 页面
- 下载最新版本的
GitSync.app.zip - 解压后拖入
/Applications目录 - 首次打开需在「系统设置 → 隐私与安全性」中允许运行
前置条件:
- macOS 13 Ventura 或更高版本
- Xcode 15+ 或 Swift 5.9+ 工具链
# 克隆仓库
git clone https://github.com/nookdesk-collab/GitSync.git
cd GitSync
# 构建 Release 版本
swift build -c release
# 可执行文件位于
# .build/release/GitSync打包为 .app(可选):
# 使用 Xcode 打开 Package.swift,Product → Archive
# 或使用 create-dmg 等工具创建安装包- 启动 GitSync 后,菜单栏会出现同步图标
- 点击图标打开面板
- 点击 设置 → GitHub 标签页,输入你的 Personal Access Token
- 需要
repo权限(推荐使用 Fine-grained Token) - 获取地址:https://github.com/settings/tokens
- 需要
- 在 通用 标签页设置默认同步目录(默认
~/GitHub)
- 点击 + 按钮
- 粘贴 GitHub 仓库 URL(支持 HTTPS 和 SSH 格式)
- 点击 检查 查看仓库信息
- 点击 添加并同步,自动克隆并开始同步
- 自动同步:默认开启,每 5 分钟检查一次远端更新
- 手动同步:点击项目行的刷新图标,或底部的「全部同步」
- 查看状态:图标颜色表示状态
- 🟢 绿色 = 已同步
- 🔵 蓝色 = 远端有更新
- 🟠 橙色 = 本地有变更
- 🔴 红色 = 冲突或错误
- 右键菜单:在 Finder 打开、终端打开、复制 URL、删除项目
- 双击项目:在 Finder 中打开本地目录
| 组件 | 技术 |
|---|---|
| UI 框架 | SwiftUI(macOS 13+ MenuBarExtra) |
| 架构模式 | MVVM(Store + 协议抽象 + 视图分层) |
| Git 操作 | Process 封装 git CLI 命令 |
| GitHub API | URLSession + async/await |
| 数据持久化 | JSON 文件(Codable) |
| Token 存储 | macOS Keychain(Security 框架) |
| 构建工具 | Swift Package Manager |
GitSync/
├── Package.swift # SPM 配置
├── README.md
├── Sources/GitSync/
│ ├── GitSyncApp.swift # 应用入口(仅 App 声明)
│ ├── Constants.swift # 全局常量集中管理
│ ├── Models/
│ │ ├── SyncProject.swift # 项目数据模型
│ │ ├── SyncStatus.swift # 同步状态枚举
│ │ ├── SyncHistory.swift # 同步历史记录模型
│ │ └── AppResult.swift # 统一结果类型(AppSyncResult + AppError)
│ ├── Views/ # SwiftUI 视图层
│ │ ├── MenuBarView.swift # 菜单栏主视图
│ │ ├── ProjectRowView.swift # 项目行视图
│ │ ├── SettingsView.swift # 设置面板(协调标签页)
│ │ ├── SettingsGeneralTab.swift # 通用设置标签页
│ │ ├── SettingsGitHubTab.swift # GitHub 设置标签页
│ │ └── SettingsProjectsTab.swift # 项目管理标签页
│ ├── Protocols/ # 协议抽象层(便于测试)
│ │ ├── GitServiceProtocol.swift # Git 服务协议
│ │ ├── SyncEngineProtocol.swift # 同步引擎协议
│ │ └── GitHubServiceProtocol.swift # GitHub 服务协议
│ ├── Services/
│ │ ├── GitService.swift # Git CLI 封装
│ │ ├── SyncEngine.swift # 同步引擎(策略决策)
│ │ ├── SyncEngineFactory.swift # SyncEngine 共享实例工厂
│ │ ├── SyncResultHandler.swift # 统一同步结果处理
│ │ ├── GitHubService.swift # GitHub API 服务
│ │ ├── AutoSyncService.swift # 自动同步定时服务
│ │ ├── NotificationService.swift # 系统通知服务
│ │ ├── NetworkMonitor.swift # 网络状态监控
│ │ └── Logger.swift # 统一日志服务(os.Logger)
│ └── Stores/
│ ├── ProjectStore.swift # 项目持久化存储
│ ├── SyncHistoryStore.swift # 同步历史存储
│ └── AppSettings.swift # 集中管理 @AppStorage 设置
- 安装 Xcode 15+(含 Command Line Tools)
- 克隆仓库
- 打开
Package.swift:open Package.swift # 或 xed .
# 调试构建
swift build
# 运行
swift run
# 使用 Xcode 运行(推荐,支持 SwiftUI Preview)
# Product → Run (⌘R)- Git 命令输出通过临时文件捕获,日志在
/tmp/gitsync-*.log - GitHub API 请求失败会打印到控制台
[GitHubService]前缀 - 项目数据存储在
~/Library/Application Support/GitSync/
MIT License. 详见 LICENSE 文件。