Files
new-markdown/docs/27-Git同步.md

54 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 仓库初始化并绑定;②改文档后手动同步,远程出现
「手动同步」提交;③另一处改同一文件后同步报冲突且本地不乱;
④开定时后到点自动同步;⑤双窗口开同一工作区时只有一个在跑。