feat(git): 工作区 Git 同步——侧栏同步条、远程设置、定时同步(提交→变基拉取→推送,冲突停下不覆盖)(docs/27)

This commit is contained in:
Muse
2026-11-14 17:35:41 +08:00
parent 13271f11b6
commit fadee6aacf
11 changed files with 792 additions and 2 deletions

53
docs/27-Git同步.md Normal file
View File

@@ -0,0 +1,53 @@
# docs/27 — 工作区 Git 同步
需求(2026-11-14):左侧面板给工作区文件夹加 Git 同步:可设置远程
仓库、定时同步时间,手动/自动把文档变更同步到远程。
## 设计
- 只接管「工作区根目录本身就是仓库根」的文件夹:在父仓库的子目录里
不启用,避免误提交别的仓库(Rust 侧用 rev-parse --show-toplevel
与根目录比对)。
- 同步语义固定一条链:fetch → 提交本地更改(add -A)→ 变基到
origin/<分支> 之上 → push(无上游时 push -u)。先提交后变基,
避免脏工作区挡住 pull。变基冲突时自动 rebase --abort 还原到同步
前状态并报错停下,不留半成品、不强行覆盖,等用户手动处理。
- git 身份缺失(未配 user.email)时提交自动附带
-c user.name=new-markdown -c user.email=new-markdown@localhost,
不让同步卡在身份配置上。
- 凭据:走系统 git 与其凭据管理器;GIT_TERMINAL_PROMPT=0 禁止终端
交互提问,认证失败直接把错误显示在同步条上。Windows 下子进程加
CREATE_NO_WINDOW 防闪黑窗。
- 实现走 git CLI(Rust run_git 封装),不引 libgit2。
## 界面
- 侧栏文件模式顶部新增「Git 同步」条:状态一句(分支 · 待提交 N 处 ·
待推送/待拉取 · 已同步 / 未设置远程 / 未启用),右侧立即同步与
设置按钮;同步结果/错误显示在条下方一行,不弹窗打扰。
- 设置弹窗:远程仓库地址、(未初始化时)初始分支、定时同步间隔
(自绘下拉:关闭/5/15/30/每小时)。未初始化时保存= git init -b
分支 + 绑定 origin;已是仓库时只改 origin 与间隔。设置按工作区
存偏好 gitsync:<root>。
- 定时同步:打开工作区后 5 秒先跑一次,之后按间隔跑;同一工作区
多窗口时用 localStorage 租约(25 秒过期、10 秒续租,与草稿认领
同一思路)保证只有一个窗口执行,避免 index.lock 冲突;手动同步
不受租约限制。定时同步拉到新文件后自动刷新文件树。
## 代码
- Rust:commands.rs 新增 git_status / git_init_repo / git_set_remote
/ git_sync_now(28 条命令与 lib.rs 注册数对账一致)。
- 前端:services/gitSync.ts(设置解析、状态文案、提交信息、租约)、
components/GitSyncModal.tsx、Sidebar 的 GitSyncBar、App 状态与
定时器接线(设置弹窗纳入 anyModal)。
## 验证
- vitest 117+2(新增 tests/git-sync.test.tsx 9 例:设置解析、状态
文案、提交信息、租约互斥、同步条渲染/点击);tsc、构建通过。
- 同步条渲染截图核验(真实 CSS,两态)。
- 沙箱无 cargo,Rust 与真实 git 流程未编译/未实跑;真机验收重点:
①对 Gitea 仓库初始化并绑定;②改文档后手动同步,远程出现
「手动同步」提交;③另一处改同一文件后同步报冲突且本地不乱;
④开定时后到点自动同步;⑤双窗口开同一工作区时只有一个在跑。