feat(git): 工作区 Git 同步——侧栏同步条、远程设置、定时同步(提交→变基拉取→推送,冲突停下不覆盖)(docs/27)
This commit is contained in:
53
docs/27-Git同步.md
Normal file
53
docs/27-Git同步.md
Normal 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 仓库初始化并绑定;②改文档后手动同步,远程出现
|
||||
「手动同步」提交;③另一处改同一文件后同步报冲突且本地不乱;
|
||||
④开定时后到点自动同步;⑤双窗口开同一工作区时只有一个在跑。
|
||||
Reference in New Issue
Block a user