更新日志
🏷️ v1.0.0-beta.4
✨ 新增
- 🖥️ 修改密码表单接入密码管理器:表单重构为真实
<form>(支持回车提交),输入框补充标准autocomplete标注(username/current-password/new-password),并加入只读用户名字段关联凭据——1Password、Bitwarden、KeePass 等可正确识别「修改密码」场景并提供生成/保存建议 - 🖥️ 表格排序:点击「仓库」「状态」「上次同步」表头切换排序,三态循环(升序 → 降序 → 恢复默认),表头带方向箭头与 aria-sort 标注;状态升序按问题优先(失败 > 同步中 > 已停止 > 未同步 > 成功),时间升序「从未同步」最先、按时间从旧到新,名称与后端默认字节序一致;未配置仓库固定排在最后,不随方向反转
- 🖥️ 同步范围选择持久化:范围下拉(全部 / 1 / 3 / 7 / 30 天未同步)的选择写入 localStorage,切到日志等页面再回到同步仓库页时保持上次选择,不再重置为「全部仓库」;表格筛选与「开始同步」计数随之恢复
🛠️ 修复
- 🖥️ 表格行悬停提示无有效信息:此前提示内容为
lastMessage,而成功同步时它是流水线步骤的固定汇总(所有仓库都显示同一条)。现改为结构化摘要——首行为整体状态与上次同步时间,其后每个备份目标一行「远端名:状态 · 详情」(失败/警告时附错误详情,超长截断 200 字符) - 📦 LFS 仓库同步到 GitLab 失败(pre-receive 报 "LFS objects are missing"):此前 LFS 对象仅靠
git push内嵌的按需上传,对象只被 tag 或历史引用时可能覆盖不到,且上传与推送存在时序竞态,GitLab 检查时对象尚未就绪而拒绝整次推送。现改为三重修复——① 每个目标推送前先执行git lfs push --all预上传全部 LFS 对象(预上传失败不阻断推送,作为警告并入该目标消息);② 推送被 "LFS objects are missing" 拒绝时等待 5 秒、重传 LFS 后自动重试一次(服务端索引滞后的竞态兜底);③ 镜像仓库写入lfs.locksverify=false(无人值守备份不应因文件被他人加锁而失败,同时消除按 ref 重复的 "Locking support detected" 警告);另将 git 输出中的连续重复行折叠为单行,避免多 tag 推送的重复警告刷爆状态消息
🏷️ v1.0.0-beta.3
✨ 新增
- 📜 仓库同步失败的日志记录失败原因:拉取/克隆阶段的 git 错误直接作为原因;多目标推送时按目标汇总错误(如「推送到 backup 失败:<错误详情>」),日志条目形如「同步仓库「demo」失败:<原因>」;原因写入前折叠空白并按字符截断(300 字符上限),保持日志单行可读
- 🖥️ 仓库编辑弹窗新增「删除仓库」按钮:编辑模式下显示在弹窗左下角(红色危险样式),点击后弹出既有确认弹窗执行删除;此前删除入口仅存在表格右键菜单中不易发现。添加模式不显示该按钮
- 🖥️ 同步仓库页新增「刷新仓库」按钮:重新扫描基地址并加载最新仓库列表(与页面加载的全量发现一致),MCP 等其他入口对仓库的增删改无需重进页面即可看到;刷新期间按钮置灰防重复点击
- 🧪 测试完善(前后端共 66 个,
cargo test34 +pnpm test32):后端借助tauri::testmock 运行时解锁 Tauri 命令层直接测试——登录/登出/改密全流程、仓库 CRUD 命令(目标清洗、重名拒绝、编辑整体替换、软删除幂等、无效令牌拒绝)、设置命令往返(基地址~展开、APIKEY 重置、日志列表)、多目标推送的独立失败语义(一个目标失败不阻断另一个,状态按目标落库)、「停止同步」终止运行中 git 子进程并落库 stopped;前端补齐仓库编辑弹窗(添加/编辑/目标行增删/保存失败错误展示)、日志页(渲染与时间格式化、空态、错误展示)、侧边栏布局(导航高亮与回调)组件测试 - 🛠️ 修复仓库编辑弹窗三个缺失的 i18n 键(
targetRemote/targetUrl/addTarget):目标地址输入框的占位符与「添加目标」按钮此前直接显示英文键名,现中英文案正常显示
🛠️ 修复
- 🌍 补齐缺失的后端文案键
sync-no-source/sync-no-targets:缺少源地址或备份目标的仓库同步失败时,界面与日志此前直接显示原始键名(如 "sync-no-source"),现显示中英文案 - 🖥️ 表格右键菜单时好时坏:菜单打开后连续右键另一行时,事件冒泡到 window 的关闭监听把刚设置的新菜单清空(表现为菜单闪没、右键"失灵");现行右键处理阻止冒泡,连续右键可直接切换到目标行。同时补齐右键行为——表头/空白区右键此前会弹出 WebView 原生菜单,现表格容器统一阻止默认行为;菜单外按下鼠标(mousedown)即关闭更跟手;菜单内的按下/右键不再误触发关闭;菜单"立即同步"失败时错误显示到界面而非静默吞掉
- 🖥️ 「开始同步 / 停止同步」按钮互斥显示:此前两按钮同时常驻、仅以禁用态区分;现按同步状态切换——无仓库同步中时显示「开始同步」,有仓库同步中时显示「停止同步」(点击终止全部运行中与排队中的同步)
- 🖥️ 同步仓库页表格不跟随范围筛选:范围下拉选择「N 天内未同步」时表格仍显示全部仓库,与「开始同步」按钮的范围不一致;现表格展示与按钮计数共用同一份范围过滤(与后端同步范围语义一致:仅保留已配置且超期或从未同步的仓库),范围内无仓库时显示专属空态提示
- 🍎 macOS 图形界面下 git-lfs 识别不到(始终提示「未检测到 git-lfs」):Finder/Dock 启动的 GUI 应用继承的 PATH 极简(
/usr/bin:/bin:/usr/sbin:/sbin),Homebrew 等用户级安装的 git-lfs(如/opt/homebrew/bin)不在其中,git lfs子命令因此找不到 git-lfs 可执行文件;现启动时为 git 子进程补充常见安装目录(Homebrew Apple Silicon / Intel、MacPorts、Linuxbrew,目录存在且未收录才追加),原 PATH 条目按原顺序保留在前、优先级不变——克隆/拉取/推送及凭据助手同样受益;终端(shell)启动路径不受影响
🏷️ v1.0.0-beta.2
✨ 新增
- 🌗 深色模式:界面跟随系统深浅色自动切换(系统切换时即时生效),设置页新增「外观」卡片可手动指定跟随系统 / 浅色 / 深色(选择存入 localStorage);全套语义色补齐深色变量(
src/index.css的.dark调色板,组件均使用语义色无需逐个适配),color-scheme同步切换使滚动条与原生控件跟随主题;应用在首帧前预应用主题(index.html内联脚本),消除深色系统下的启动白屏闪烁
🛠️ 修复
- 🤖 MCP
remove_repo误报「仓库不存在」:存在性判定误用了sync_targets的删除行数,无目标的自动发现仓库已被移除却返回错误;现按repos行判定,成功响应附带仓库 id 与名称 - 🤖 MCP 服务在数据库忙时可能启动即崩溃(此前无 busy_timeout 且启动失败直接 panic);现设置 5 秒写冲突忙等(GUI 与 MCP 共用),启动失败向 stderr 输出原因后以非零码退出,单请求异常被捕获并以 JSON-RPC 内部错误应答、进程不再退出
🚀 改进
- 🤖 MCP
add_repo改为按仓库名幂等:同名仓库(含已隐藏)存在时更新源地址、合并目标并重新登记,响应带created标记,不再产生重复条目 - 🤖 新增 MCP 工具
update_repo与list_logs:前者修改仓库名称与源地址(提供targets时整体替换目标列表),后者按时间倒序读取操作日志(limit可选,默认 200、上限 1000,只读不写日志);工具描述明确三条语义(add 合并 / update 替换 / remove 软删除) - 🤖 新增 MCP 工具
discover_repos:扫描基地址(中转站目录)内已有本地仓库并登记——origin 远端作源地址、其余全部远端作备份目标,与界面自动发现逻辑一致,返回登记后的完整列表 - 🤖 新增 MCP 工具
sync_repos:批量触发同步——ids列表或days范围(0=全部仓库,N=最近 N 天未同步,含从未同步,与界面范围下拉一致),未配置仓库自动跳过并按仓库报告是否启动;界面与 MCP 的入队逻辑统一为共用函数。现共 11 个工具 - 🤖 MCP stdio 服务将每个请求的方法与耗时输出到 stderr,便于排查断连类问题
- 🗄️ 旧库升级:同名重复仓库启动时自动去重(保留可见行中最早创建的,目标并入保留行后删除多余行),并为
repos.name建唯一索引防止再次产生重复 - 🖥️ 界面添加/编辑仓库增加重名校验,重名时给出可读提示而非数据库错误
- 🧹 代码拆分:repos.rs(1540 行)拆为 repos(CRUD 命令)/ discover(自动发现)/ sync(队列与命令)/ git(git 子进程流水线)四个模块,mcp.rs(1068 行)拆为协议层与 mcp/tools.rs 工具层;前端 SyncPage 抽出编辑/删除弹窗组件、i18n 词典拆至 src/i18n/(纯重构,48 个测试全绿)
- 🧪 测试设施:前端新增 vitest 单元测试(外观主题 / 多语言时间格式化 / 类名工具 / 登录、设置、同步仓库、MCP 页组件渲染,jsdom + matchMedia 桩 + @testing-library/react),后端补齐同步流水线全本地端到端(真实 git 子进程验证拉取→更新→推送与失败路径)、路径归一化、.git 远端解析、会话过期清理、语言标签与文案解析、MCP 协议层与工具校验用例(前后端共 48 个测试,本地
pnpm test/cargo test运行)
🏷️ v1.0.0-beta.1
✨ 新增
- 🖥️ 跨平台桌面应用(Windows / macOS / Linux):基于 Tauri 2,Rust 后端 + React + TypeScript + shadcn/ui 风格界面
- 🗄️ SQLite 数据库:用户、会话、仓库、设置与操作日志全部入库单个
app.db(WAL 模式);首次启动自动建表并初始化 - 🔄 仓库同步流水线(本地基地址中转):从源仓库拉取到本地基地址下的中转目录(如
~/repo/仓库名),更新中转站的 LFS 与 submodule,再推送分支与标签到目标仓库地址;基地址可在设置页修改(默认~/repo,支持~路径);采用 fetch-only 模式(不合并工作区,无人值守安全)、LFS/submodule 失败降级为警告、推送--prune与来源强制对齐、每步网络命令带超时与低速中断、多仓库串行执行 - 🔐 用户登录:初始账号
admin/ 初始密码admin123(首次启动自动创建),支持「保持登录 30 天」的持久化登录,重启后自动恢复登录态;密码可在设置页修改(需验证旧密码) - 🖲️ 同步仓库页面:顶部操作栏提供「开始同步 / 停止同步」按钮与同步范围下拉选框(全部 / 1 / 3 / 7 / 30 天内未同步,含从未同步的仓库);表格展示仓库、源地址、目标地址、状态(同步中 / 成功 / 失败 / 已停止)与上次同步时间;自动发现基地址内仓库与 1 对多备份:
origin远端作为主仓库源地址,其余全部远端自动登记为备份目标(缺失显示「未配置」,删除仅隐藏不重复登记;未配置仓库不参与同步,「开始同步」自动跳过);备份目标按远端名直接展开为表头列,每列独立显示同步状态,一次同步依次推送到全部目标(单个失败不阻断其余);双击或右键表格行弹窗编辑,右键菜单支持编辑、立即同步、删除;「停止同步」可直接终止 git 子进程;同步期间禁用 git 交互式凭据输入,避免私有仓库卡住 - 📜 日志页面:按时间倒序列出软件操作历史(操作、操作人、操作时间),软件全部操作入库 SQLite,界面操作记录登录用户名、Agent 操作记录
mcp - 🔌 MCP 页面:展示 MCP 连接配置(API Key、可一键复制的客户端配置示例)与全部可用工具说明,帮助用户理解与配置接入
- 🤖 Agent(MCP 接入):软件采用 MCP stdio 连接方式——Agent 以子进程运行
git-repo-sync.exe mcp(换行分隔 JSON-RPC 2.0),通过 APIKEY 鉴权(环境变量GIT_REPO_SYNC_API_KEY或--api-key参数);提供list_repos、add_repo、remove_repo、sync_repo、get_sync_status、get_base_dir、set_base_dir七个工具;客户端断开后进程等待在途同步完成再退出,不中断同步 - 🌍 多语言支持(简体中文 / English):后端采用 fluent-i18n,全部文案集中在 Fluent 语言包(
locales/*.ftl),缺失翻译自动回落中文;前端采用 react-i18next,设置页提供语言卡片切换(浏览器语言探测 + localStorage 记忆);MCP 工具描述、参数描述与运行时消息按 Agent 客户端 initialize 的locale返回,可用环境变量GIT_REPO_SYNC_LANG(zh/en)强制指定;工具名称为协议契约不随语言变化 - ⚙️ 设置页面:修改本地仓库基地址、修改账户密码、展示软件版本号与本软件源码仓库
- 🏷️ 版本与发布体系:版本号统一维护在 package.json(
version/msiVersion/baseVersion),version.ps1一键同步到 tauri.conf.json、Cargo.toml 与 Cargo.lock;tag.ps1一致性检查后打 tag 触发发布;CI 在 PR 与发布时双重校验版本一致性
🚀 改进
- 📦 发布流水线:GitHub Actions 四平台矩阵打包(Windows x64、macOS Apple Silicon / Intel、Linux x64),tag 推送后自动发布至 GitHub Releases;
vX.Y.Z-beta.N形式的 tag 自动标记为 Prerelease;MSI 版本采用独立发布序列号(第 N 次发布为 1.0.N),规避 MSI 版本不支持 beta 语义的问题,保证新旧版本可覆盖升级 - 🖼️ 图片资源统一由 Git LFS 管理,CI 检出时自动拉取