Skip to content

0.2.2

Choose a tag to compare

@Dyse-Sofqi Dyse-Sofqi released this 09 Oct 19:05
· 11 commits to main since this release

[0.2.2] — 2026-10-10

这一版做两件事:别让大文件进 git(两层预防),以及已经大了怎么办(清理)。
起因是一次实测:一个 159 次提交的笔记库有 460 MB 的 .git,其中插件构建产物 319 MB、
字体 186 MB、向量库缓存 84 MB,而真正的 markdown 只有 63 MB —— 仓库体积失控几乎从来
不是笔记造成的。而 git 的历史不可逆:大文件一旦提交进去,事后清理要重写全部提交,
那是一件按提交数计时的重活。所以预防建在「它进历史之前」,清理则是一套独立的、
把代价说在前面的动作。

还有一条独立的轴:重写历史的开销只吃提交数,与每个提交改了多少字节无关 ——
20 MB 但有 10000 个「只改一行」的提交,重写要几小时;500 MB 但只有 200 个提交,
只要十几分钟。所以「本地状态文件」(光标位置缓存、工作区布局)进 git 的代价
不是体积,而是每个同步周期白多一个提交。大文件拦截防不了这一条。

新增

  • 清理:体检 / 回收 / 深度清理(设置页「仓库同步」的清理一节)。三层风险递增,
    每一层都说清代价:
    • 体检(只读)—— 按目录汇总历史里占空间最多的部分,外加最大的单个对象。
      按目录而不是按文件,是因为剔除的单位就是目录:报告里的每一行正好是一个
      可以拿去执行的动作。库根目录的文件只报账、不提供勾选(剔掉它们等于清空整个库)。
    • 回收空间 —— git gc --prune=now。安全,但常常一点也回收不到:大文件基本
      都在可达的历史里,只有重写才能清掉。这句话写在描述里,免得你把「没变小」当成功能坏了。
    • 深度清理(不可逆)—— 把选中的路径从全部历史里剔除(重写每一个提交)。
      动手前会把三件事摆出来:所有提交的哈希都会变(远端要强制推送、其他设备要重新
      clone)、已经推到远端的旧历史清不掉、以及预计耗时(按提交数算,实测约
      3.5 秒/提交 —— 一个 159 提交的库约 10 分钟,期间请不要关闭 Obsidian)。
      执行前先建一个备份引用(refs/obsync-backup/<时间戳>),失败或后悔都能退回去;
      执行后自动把那几条路径写进 .gitignore,否则它们会在下次提交时原样回来。
    • 丢弃备份并回收 —— 重写之后空间不会立刻变小(备份还拉着旧对象,这是刻意的:
      先让你确认库还能用,再丢退路)。确认无误后点它,才真正释放空间。不可逆。
  • 提交前的大文件拦截(设置页「仓库同步」的大文件阈值,默认 5 MB,填 0 关闭)。
    提交 / 立即同步时,待提交文件里超过阈值的会被拦下、弹窗问一次,整条链路停在
    那里 —— 不会出现「同步完成」而那个文件其实没提交。弹窗把两个选择各自的代价都写清楚了:
    仍然提交(它以后每次改动都会在历史里再存一份完整副本)或退出跟踪并忽略
    (不再有版本历史、本地文件保留;历史里已有的副本不会消失,仓库体积不会因此变小)。
    关掉弹窗 = 取消。自动同步不弹窗,改为发一条通知告诉你「同步已暂停、去哪处理」。
  • 「补齐推荐的忽略规则」按钮(设置页「仓库同步」的 .gitignore 一节)——
    把字体(ttf/ttc/otf/woff/woff2,大小写各一条)、Office / LibreOffice 临时文件
    (~$*、.~lock.*#)、本地状态文件(workspace.json、workspace-mobile.json、
    workspaces.json、*-position-cache.json)这几类规则并进 .gitignore。
    只追加缺的那些,你自己写的规则一行都不动,可以随手点(幂等)。
    它与那个覆盖式的「填入默认内容」是两回事。
  • 「停止跟踪本地状态文件」按钮(同一节)—— 光加忽略规则对已经跟踪的文件没用
    (.gitignore 只管未跟踪的),而已经同步了一阵子的库恰恰是最需要它的。这个按钮
    把已跟踪的那几个从索引里摘掉(本地文件不动),并补上忽略规则。会先让你看见
    要摘哪几个再确认。
  • 「忽略插件目录」开关(默认关)—— 打开后把整个插件目录也加进推荐规则。
    插件是仓库体积最大的单一来源,但忽略之后换设备 clone 时插件不会自动就位,得重新装。
    这是个取舍,所以做成开关交给你,而不是替你选。
  • 面板每一行的「放弃更改」(仓库同步面板的「更改」列表,2026-10-10)——
    一键把那个文件退回上次提交的样子。两种场景共用一个动作,因为它们在 git 眼里是同一件事:
    改坏了想退回、以及误删了想找回(被删的文件会从上次提交里重新写出来)。
    它是本插件唯一会丢用户编辑的动作,而且不可逆(放弃的编辑从来没被提交过、
    不在 git 里),所以:确认弹窗会列出具体哪几个文件、把「不可逆」写在正文里、
    确认按钮用警示色。两类行不给这个入口:未跟踪的新文件(它们没有「上次提交」
    可退,而「放弃」对它们等于删掉一个新文件 —— 丢的东西一点退路都没有)、
    冲突行(冲突区已经有「放弃本次合并」,而面板看不到文件内容,
    在这里替用户决定「用哪一边」正是不该做的事)。
  • 「文件恢复关着」的警告框(仓库同步页最上方,只在它关着时才出现)——
    Obsidian 的「文件恢复」核心插件默认每 5 分钟给每个改过的文件存一份快照、保留 7 天,
    存在 IndexedDB 里,完全不碰 git。它才是「高频防丢失」该用的机制:git 的恢复粒度是
    全库提交,用它做高频恢复会让提交数等于编辑次数。所以想靠缩短同步间隔来防丢数据时,
    这个警告框会先把你指到那里。(第一版是塞进「注意事项」的一条,太不显眼 ——
    它讲的是数据安全,现在有独立的警告配色与标题。)

变更

  • 定时同步的默认周期 10 分钟 → 30 分钟(只影响新装的库与缺这个字段的库,
    已经存过这个值的库不受影响)。理由:高频保护已经明确交给「文件恢复」,定时同步剩下的
    职责是「云端新鲜度」与「跨设备」,而灾难恢复本身要花几小时 —— 丢 30 分钟与丢 5 分钟
    没有实际差别。反过来,间隔越短提交数越线性增长,而重写历史的开销只吃提交数。
    想让云端更实时请用「立即同步」(命令 / 面板 / 功能区都有)。
  • 去掉了仓库同步面板上的逐文件暂存(「暂存此文件 / 取消暂存」与「全部暂存 /
    全部取消暂存」)—— 它们做不到看起来在做的事:SyncHub 的「提交」是 git add -A,
    手动暂存了什么对最终提交毫无影响;更要紧的是定时同步到点会把它们一起提交掉,
    也就是说这个按钮连「暂时不提交」都做不到。用户暂存 A 想只提交 A,结果 B 一起进去了。
    SyncHub 不做选择性提交 —— 它的定位是「把整个库同步上去」。按暂存状态的分组保留
    (冲突文件落在「已暂存」那一组)。
  • 自动同步被大文件拦下时会给一条通知(以前是静默停住)。只要那些文件还在,自动同步
    就一直停着 —— 这条通知是它唯一的表现,所以每次到点都会提示一次。
  • 文案口径改了:「已经写进历史的图片 / 文件不会让仓库变小」那几处,以前一律接
    「本插件不做重写历史」—— 现在指向设置页「清理」里的深度清理。

修复

  • 设置页里 .gitignore 代码框的全宽失效了。 它那条 width: 100% 被 CSS 解析器
    整条丢弃:上面那句注释里写了 `**/` 递归,而 **/ 里的 */ 提前结束了注释,
    剩下的文字被当成下一条规则的选择器,于是规则连同它一起被丢掉 —— 不报错、样式就是不生效。
    代码框因此只有 173px 宽(容器 660px)。同一段注释里 min-height、white-space、
    padding 也一起失效了。
    pnpm check 新增第 8 项CSS 注释完整性守住这类问题:现有「CSS 类覆盖」那一项拦不住它
    (被丢弃的规则在文本上仍然「有定义」)。