登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
【大赛通知】开源中国「2026北京开源行业解决方案创新赛」火热报名中,百万奖池等你的项目
代码拉取完成,页面将自动刷新
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
1
Star
0
Fork
0
烛知知
/
SyncHub
代码
Issues
0
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
发行版
标签 (Tag)
全部
全部
正式版
预览版
发行版列表
0.2.4
最新版
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.2.4
最新版
对比
烛知知
2026-10-10 14:04
0.2.4
7c8e451
这一版把「深度清理」(重写历史)从一条**半截流程**补成一条能走完、能中断、能续做、 并且说清代价的完整流程。修了四个真 bug,其中两个会丢东西;顺手把清理相关的 报错全部改成了中文。 > 起因是三条实测反馈:清理完之后点「立即同步」报一句英文的 > `refusing to merge unrelated histories`;第二次清理直接失败; > 以及「清理完 `.gitignore` 多出目录,那这些目录以后岂不是不进同步了?」—— > 最后这个问题界面**从来没回答过**,而它恰恰是这个动作最要紧的后果。 ### 修复 - **重写不再删掉你的本地文件。** `git filter-branch` 的最后一步会把工作区对齐到 改写后的 HEAD,于是**被剔除的目录会从磁盘上消失** —— 与「只清历史」的承诺正好相反。 勾一个装着笔记的目录,笔记就没了。现在重写之后会把它们放回磁盘(内容与重写前 一模一样),确认页也把这条写成了明确的承诺。 - **第二次深度清理不再必然失败。** filter-branch 见到上一次重写留下的 `refs/original/` 就拒绝开始,而插件只在「丢弃备份并回收」里清它 —— 等于 「清理两次之间必须先丢弃备份」,与「备份引用带时间戳(因为用户可能清理多次)」 的设计意图相矛盾。现在重写时会自动覆盖那份中间引用。 - **重写报错不再等于「什么都没发生」。** 引用是边改写边更新的,收尾那次工作区同步 失败会让命令报错、但历史**已经变了**。原来这种情况被报成「重写失败」,于是忽略规则 不写(下次同步把刚剔掉的路径原样提交回来)、结果页也不出现,而哈希全变、远端分叉 已经发生。现在按「引用动没动」判断。 - **重写把整条历史清空时,分支会被自动还原。** 勾选的路径若覆盖了每个提交的全部内容, 没有提交能活下来,git 会把当前分支整个删掉、仓库落到「没有提交」的状态。 现在检测到就当场还原,并告诉你「库是好的,请少勾一些路径」。 - **重写之后「立即同步」不再卡死。** 重写后本地与远端没有任何共同提交,拉取会报 `fatal: refusing to merge unrelated histories`。现在这句话有中文说明、并且**直接告诉你 该做什么**(强制推送);拉取与 rebase 也会在动手之前就停下来(真跑起来会留下一仓库冲突)。 - **清理相关的报错全部中文化**,不再出现 git 的英文原文。 ### 新增 - **深度清理的四步收进一个窗口**:体检 → 重写 → **强制推送** → **确认库没问题后丢弃备份**。 推完自动进入收尾页;收尾页列出三件具体要检查的事(打开几篇笔记 / 图片能不能显示 / 别的设备重新 clone),然后才是「丢弃备份并回收」。**空间要到这一步才真正释放** —— 以前结果页的次要按钮写着「完成」,会让人以为整件事结束了。 - **设置页「清理」一节多了「继续上次的清理」**:只要还有未完成的清理(重写备份还在), 它就可点,点进去**直接到收尾那一步**。中途关掉 Obsidian、甚至重启之后都能接着做。 - **体检报告里,目录行会标出「N 篇笔记」**;确认页会明确告诉你:**剔掉的目录以后不再 跟着 git 同步**(会被写进 `.gitignore`),其他设备 clone 之后不会有它们。 如果勾中的目录里有笔记,会额外警告一次 —— 这是这个功能唯一会让人丢东西的路径。 ### 修复(进行中的可见性) - **重写进行中有进度可看了**:弹窗里显示「已用 X,预计总共约 N 分钟」,左下角状态栏与 「仓库同步」面板顶部也会一直显示「正在重写历史…」。窗口可以关掉,重写完成之后 结果页会自己弹回来(关掉它**不会**让结果丢掉)。 - 进度**不报百分比**:重写是逐提交跑的,git 不会告诉你「处理到第几个提交」, 编一个百分比就是骗人。 ---
最后提交信息为:
chore(release): v0.2.4 —— 深度清理补成完整流程,并修掉两个会丢东西的 bug
0.2.3
对比
烛知知
2026-10-10 03:35
0.2.3
337016c
这一版只修一个 bug,但它是**必现**的:在一个「刚建好、分支从没推过」的仓库里点 「立即同步」,会直接报错、什么也不做。 根因是同步链路里的一个**死锁**。链路是「提交 → 拉取 → 推送」,而拉取这一步 **硬要求当前分支已经配置了上游**;可**建立上游的恰恰是推送**(推送用的是 `git push -u origin <分支>`)。于是拉取先报错、链路中断、推送永远轮不到, 上游永远建不起来 —— 第一次同步必然卡死。 > 触发它的仓库形态很常见:远端分支和本地的 `origin/<分支>` **都在**, > 只是 `branch.<分支>.remote` / `branch.<分支>.merge` 还没写进配置 > (这两项正是推送会替你写的)。也就是说,问题不在「仓库没配好」, > 而在「只差一次推送」。 ### 修复 - **分支没有配置上游时,拉取不再报错。** 改为:有配置的上游就用它;没有就退回 **同名的 `origin/<分支>`**(在 `fetch` 之后判断,否则一个从没 fetch 过的仓库 看不到远端分支);远端连这个分支都还没有时,**没有东西可拉** —— 直接跳过, 把建立上游交给随后的推送。这样「刚建仓库 → 点立即同步」一次就能走通。 - **只有在压根没配置远端时才会拦下**,提示改为「还没有配置远端仓库,无法拉取。 请在设置中填写远端地址。」—— 指向真正该做的事,而不是让你去「先设置上游分支」。 - **游离 HEAD 的提示语从「无法推送」改为「无法同步」**:它现在拉取和推送都会出现, 而「请先切换到一个分支」这条建议两边都适用。 ### 内部 - `NoUpstreamError` 的含义收窄为「没有配置远端」(原来还把「分支没配上游」算在里面, 两者应对方式不同,混用会把用户指错方向)。 - 新增 2 条真实仓库测试:抹掉上游配置后仍能拉回远端提交;远端还没有该分支时 拉取返回「已是最新」、随后的推送把上游建起来。
最后提交信息为:
chore(release): v0.2.3 —— 修「分支没配上游时立即同步直接报错」
0.2.2
对比
烛知知
2026-10-10 03:06
0.2.2
1f189bb
这一版做两件事:**别让大文件进 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 类覆盖」那一项拦不住它 (被丢弃的规则在文本上仍然「有定义」)。
最后提交信息为:
feat(sync): 面板每一行加「放弃更改」
0.2.1
对比
烛知知
2026-10-09 18:52
0.2.1
be69133
这一版把**功能区头像**从「一张只能看的图」变成**设置页的入口**:点它打开设置窗口并停靠 「通用」页(换平台、改令牌都在那一页),头像外侧常驻一圈柔灰虚影环、悬停时环加深并晕开 一团保守的模糊扩散,而**光标保持默认** —— 它首先是一张头像,点击只是顺手的入口。 另给状态栏条目加了一个「**贴靠最左侧**」开关(默认开),并**删掉了「状态栏占满整屏宽」 开关与那条拉全宽的 CSS 规则** —— 状态栏恢复 Obsidian 原生形态(右下角一簇), 条目仍排在这一簇的最左侧。 ### 新增 - **功能区头像可以点了**(2026-10-05 加的那个头像):点它**打开设置窗口并停靠 「通用」页**(换平台、改令牌都在那一页)。两条刻意的「不摆出按钮样子」的设计: 头像外侧**常驻**一圈**虚影环**(2px 柔灰,紧贴头像边缘、中间没有缝),**悬停时** 环加深并晕开一团**模糊扩散**(范围保守,不超出功能区),而**光标保持默认** —— 它首先回答「这是谁」,点击只是顺手的入口 - **「状态栏同步条目贴靠最左侧」开关**(设置页「通用」,默认**开**)。开着就是一直以来的 表现:同步条目排在状态栏那一簇的最左侧(只改自己的视觉顺序,不动其他条目)。 关掉后条目**不作特殊处理**,按 Obsidian 默认顺序排在其他条目后面。 它与下面删掉的「状态栏占满整屏宽」是两回事:那个碰的是**状态栏的宽度** (为了贴屏幕最左,代价是整体观感从「右下角一簇」变成「底部一条」),已整条删除; 这个只管**条目在状态栏里的顺序**,状态栏本身两种状态下都是 Obsidian 原样 ### 变更 - **「状态栏占满整屏宽」开关删掉了,状态栏不再拉成全屏宽。** 同步条目仍然排在 状态栏那一簇的**最左侧**(只改自己的视觉顺序,不动别人的条目),只是不再贴 **屏幕**最左。理由:拉宽能让条目贴到屏幕最左,但代价是状态栏的**整体观感** 从「右下角一簇」变成「底部一条」—— 那是用户自己的界面。设置项、那条 CSS 规则与 `main.ts` 里给 `body` 加/摘类的代码一并删除;老 data.json 里残留的 `statusBarFullWidth` 字段会被自然忽略,不需要迁移
最后提交信息为:
release: 0.2.1 —— 头像可点开设置、状态栏条目贴最左开关,并删掉状态栏全宽
0.2.0
对比
烛知知
2026-10-08 02:19
0.2.0
f1bc8b4
这一版补上了一整块**「看得见的状态」**(功能区头像、同步特效横幅、状态栏忙碌圆环、 初始化徽标),把**主题**从「只能绑定 / 更新」补成「**也能新装**」,给图片同步加了 **变动后自动同步**,并修掉一个在 Obsidian 1.14 上让功能区头像**静默消失**的选择器问题。 ### 新增 - **功能区头像**(设置页「通用」)—— 打开后在左侧功能区(ribbon)**底部**挂一张 **当前令牌账号**的圆形头像。它回答的是「现在配的令牌是哪个账号」(镜像探测拿的 也是这个账号名),没有点击动作。 地址与账号名来自**同一次** `validateToken()`(Gitee 的 `GET /v5/user` 一个响应里 两个字段都有),所以**不多打一次接口**;那个平台没配令牌时**一个请求都不发** —— 匿名问那个接口只有 401,而 Gitee 的匿名配额实测极低。 平台由下面新增的「**使用 Gitee 头像**」决定(默认开 = Gitee,关 = GitHub)。 头像是**账号资料**、插件改不了,所以那一行的描述末尾直接给了**换头像的个人资料页 链接**,并且跟着平台走(Gitee → `gitee.com/profile`、GitHub → `github.com/settings/profile`)—— 点一下就到换头像的地方。 - **主题也能新装了。** 在它之前主题只有两条路:**绑定**库里已经装好的、**更新** 已跟踪的 —— SyncHub 从来**没能把一个主题装到磁盘上**。现在多了「**添加主题仓库**」 按钮与命令,主题写进 `{configDir}/themes/{主题名}/`,装完**不替你切换** (到「设置 → 外观 → 主题」里选它)。 三处刻意与插件不同:目录名取远端 manifest 的 `name`(不能当目录名时回落到仓库名)、 **不做镜像发现**(主题的镜像判据依赖本地已装的那一版,新装时手上还没有)、 绝不调 `setTheme`。另外立了一条安全线:目标目录里已经装着**另一个**主题时 **拒绝写盘**(同名不同主题确实存在,而被覆盖的很可能是你当前正在用的那个, 且它不一定在跟踪列表里、没有「重新下载」这条路)。 把主题地址填进「添加插件仓库」(或反方向)时,失败后会探一次对面的标志性文件 (`main.js` / `theme.css`),确有就给一个「**改为按主题安装**」的按钮 —— 而不是只留一句「缺少 main.js」。 - **「正在同步」看得见**(状态栏 + 侧边栏面板)。 状态栏那一格忙碌时挂一个**转动的圆环**并把文字改成强调色(原来忙碌态与常态 只差几个字,一样是 12px 灰字,在一排条目里扫过去看不出区别,而同步可能要跑几十秒); 文案也从「正在提交…」改成「**正在同步:提交中…**」—— 点「立即同步」时一眼能分出 这是三步链路里的一步,后面还有拉取与推送。 侧边栏仓库同步面板的工具条**正下方**加了一条同步特效横幅(转圈 + 三个阶段 + 一根**不确定**进度条 —— git 不会报「推到第几个对象」,编一个百分比就是骗人; 三个阶段本身才是真实可得的进度)。动作进行中四个动作按钮禁用(**刷新不在其中**, 它只读,随时可点)。横幅**不整块重绘**:一次「立即同步」三个阶段各变一次, 走整块重绘会白跑三遍「分支 / 远端 / 体积 / 历史」(实测一次重绘 10 个 git 子进程)。 - **图片「变动后自动同步」**(设置页「图片同步」,默认**开**)—— 在受管文件夹里 新增或改动图片之后,**停手 30 秒**(5–600 可调)自动跑一轮。一次编辑会话 (拖进一批图、批量压缩)会被合并成一轮,也不会在你还在写文件的时候开始。 它只管**本机**的改动。 **周期同步**的职责因此改成「拉回**其他设备**上的变化」(另一台设备传的图、云端被 手工改动的对象 —— 那些在本机不会产生任何事件),默认周期从 10 分钟改成 **30 分钟** (它默认仍是关的)。完整推导(成本模型、四个触发器的分工、明确不做的事)见 [`docs/image-sync-design.md`](docs/image-sync-design.md)。 - **设置页「仓库同步」能独立走完全部基本设置** —— 「**初始化 git 仓库**」从侧边栏 面板搬进设置页,与远端地址、git 可执行文件路径排在**同一张卡片**里(这三项都是 「连接测试能通过」的充要条件),排在「连接测试」之前。那一行带状态徽标 (「已是 / 还不是 git 仓库」,已是时按钮置灰)。 - **插件安装器页重排 + 标签数字徽标。** 页内顺序改为:状态小字 → SyncHub 自身更新 卡片 → 「启用 Gitee 镜像源更新 SyncHub」开关 → 「进入设置页时自动检查」→ 「启动时检查更新」→ 启动检查延迟 → 「自动发现 Gitee 镜像」。 **「进入设置页时自动检查」现在同时查跟踪列表与 SyncHub 自身** —— 一个插件都没跟踪的 用户同样该知道自己有没有新版本。SyncHub 自身有可用更新时,「插件安装器」**标签上挂 数字徽标**(原来只在页面里一行小字,Notice 一闪就错过)。 ### 变更 - **访问令牌移进「通用」页**(原来在「插件安装器」页)。它和头像同处一页 —— 两者讲的 是同一件事(当前配的是哪个平台的哪个账号)。 - **自身更新来源从自由文本框改成开关**「启用 Gitee 镜像源更新 SyncHub」(默认**开** = 走 Gitee 镜像 `sofqi/SyncHub`,关 = 走官方 GitHub 仓库)。两个固定地址之间切换本来 就是二选一,而原先的自由文本框要用户先读懂一串规则(空串算默认、`owner/repo` 简写 按 GitHub 解释、非法地址抛错)才敢动。 代价是**不再支持自定义来源**(如自己的 fork)—— 那个场景本来也不成立:写盘前校验 远端 manifest 的 `id` 必须是 `ob-sync`,fork 改了 id 就会被拒。 - **删掉「启用插件安装器」总开关。** 它在 `src` 里只有两个读取点,且都是自动检查的 **前置条件**(功能区那个图标、5 条安装器命令、设置页按钮与列表**从来不看它**)。 于是「关掉它」与「把两个检查开关都关掉」**完全等价** —— 一个 off 的第二种说法, 而名字让人以为「不装了」。 - **按钮行的外观与图标**:「添加主题」→「**添加主题仓库**」;「绑定已安装的插件与主题」 →「**绑定已有插件或主题**」(并在文字前加 lucide `link` 图标);「检查全部更新」→ 「**检查更新**」(加 `refresh-cw` 图标)。**这一排按钮的卡片(连同标题与说明)去掉**, 只留按钮 —— 页签名已经是页名,列表下方还有空状态提示,标题与说明都是重复信息。 - **四个设置页的页首标题删掉**(插件安装器 / 仓库同步 / 图片同步 / 通用)—— 标签页 已经写着页名,再顶一行同名标题是重复。**节内**的小标题(「访问令牌」、R2 连接、 连接测试…)留着。 ### 修复 - **Obsidian 1.14 上功能区头像「静默消失」。** 1.14 把功能区容器的修饰类从 `mod-left` 改成了 `mod-primary`,而 `findRibbonContainer()` 的四个选择器**全都写着 `mod-left`** → 一个都匹配不到 → 恒返回 null → `render()` 静默 return,**没有任何报错**(所以 它看起来像「某个改动弄坏了」)。现在补上 `mod-primary`(保留 `mod-left`),再加一条 **不依赖版本修饰类**的兜底 `.workspace-ribbon .side-dock-settings`(只有左 / 主功能区 才有这一组,不会误取右侧)。 教训:**选择器不要依赖版本修饰类,永远留一条不依赖它的兜底**;升级 Obsidian 后要 重抠 `.probe` 的 `app.css` 并重跑对应探针。 - **「初始化 git 仓库」的状态徽标每切一次设置页就重问一次。** 每次重绘都起一个 `git is-repo` 子进程,结果回来才填徽标 —— 于是能看到徽标「弹」出来,布局还被撑高 (`.obsync-badge` 的 `line-height: 1.6` + `padding: 0.05em` 让药丸 20px,而标题那一行 只有 17px,整行被顶高 3px、说明文字往下移)。现在问过一次就缓存(**只在内存**: 这个值会变 —— 别处 `rm -rf .git`、从别的设备同步回一个没初始化的库 —— 写进 `data.json` 就是一句没人纠正的假话),并把徽标改成 `line-height: 1` + `padding: 0.15em 0.5em`(改完重量一遍:「有徽标」与「没徽标」逐项相同)。 - **点完「初始化仓库」后按钮又亮回来** —— `apply()` 改成同步之后,点击处理 `finally` 里的 `setDisabled(false)` 会把刚被置灰的按钮重新点亮;改成按已知事实恢复。 - **`setButtonText` 与 `setIcon` 连用只剩图标。** `setButtonText` 是「清空整个按钮再写 文字」,而 `ButtonComponent.setIcon` 会先删掉第一个子节点再 append 图标 —— 两者连用, 文字被当成「第一个子节点」删掉。按钮行那两个图标因此自己建一个容器装图标、再 prepend 到文字前面(换文字之后还要重调一次)。 ### 内部 - **平台列表移进 `host/types.ts`,`HostKind` 由它推导** —— 此前「有哪些平台」有 4 份 副本,其中 `settings` 那份(持久化校验)漏掉某个平台时,用户在那个平台上装的插件会在 下次加载 `data.json` 时被**当成非法条目无声丢弃**(不报错,列表里就没了)。 - 删掉两处死代码:`InstallerService.checkForUpdate`(判据用 `requestedVersion`,跟踪 最新版时那个值是字符串 `"latest"`,几乎恒报「有更新」)与 `isManifestCompatible`。 - 设置迁移 **v8 → v9**(自身更新来源从「自由地址」折算成布尔)与 **v9 → v10** (删总开关时把两个检查开关置 false)。折算规则与当年那套解析同源,坏形状一律按当年 同一口径处理 —— 老用户升级时行为不变。 - 新增两个**能脱离 Obsidian 单测**的纯逻辑模块:`ImageChangeQueue`(攒批器:静默期 + 硬上限 + 正在跑时不丢)与 `features/avatar/ribbonAvatar.ts`。测试增至 **88 文件 / 1871 用例**。 - `.probe` 的 `app.css` 随 Obsidian 1.14.4 重抠,头像探针的功能区类名改用 `mod-primary` 并把两档类名都跑一遍;README 补了「升级 Obsidian 后要重抠 + 两档都要跑」。 ---
最后提交信息为:
release: 0.2.0 —— 头像 / 主题新装 / 同步特效 / 图片变动后自动同步
0.1.9
对比
烛知知
2026-10-05 03:15
0.1.9
31521cb
这一版集中在**仓库同步面板**与**设置页「仓库同步」**的可用性,另有一批文案与布局修复。 ### 新增 - **面板顶部重排 + 「更改 / 最近提交」标签组。** 状态摘要(`与远端一致` / 领先落后)与 「仓库大小 / 待提交改动」两栏搬进「更改」页顶部;列表按标签组切换,长列表不再互相挤占滚动位置。 切换标签只换可见性,**不重跑那几条 git 命令**。冲突区留在标签之外(它是「现在就得处理」的状态)。 - **更改列表的格式筛选。** `全部 / Markdown / .png / …`,选项由**这一轮真实出现过的格式**生成并带 数量 —— 只想看笔记时一眼筛出 `.md`。筛选只影响列表,「待提交改动」那一栏始终是总数。 - **「嵌套仓库」行(gitlink)识别与一键「不再跟踪」。** 在库的插件目录里就地开发时,那些目录自带 `.git`,库把它们记成**指针**(索引模式 `160000`):看着像文件夹、没有文件级差异、怎么点「全部暂存」 都消不掉。面板现在给它加徽标、写明原因,并给一个「不再跟踪」(摘索引 + 写 `.gitignore`, 本地文件与它自己的 `.git` 一个都不动)。 - **差异视图改成主工作区标签页**(原来是弹窗 —— 太小,长行读不了),并加了 **双栏对照**模式 (像 VS Code:删除在左、新增在右,同一段改动按序号对齐,多出来的那一行只有一边有内容)。 视图模式跟着标签页记住;文件差异会跟着库状态自己刷新。 - **面板工具栏显示距离下一次同步的倒计时**(与设置页那一行同一份数据),后移到「与远端一致」 同一行展示 —— 两者都是「我现在处于什么状态」。 - **设置页「仓库同步」重排:** 远端地址(**就地可改的输入框**)+「打开仓库同步面板」同一行、 git 可执行文件路径,**这两项排在「连接测试」之前**(它们是「测试能通过」的充要条件)。 - **标签栏照 MDRazor 重做**(只有当前那一个是贴着内容区的卡片),工具条按钮去阴影、 间隙收紧到 4px,刷新按钮改成与前面三个同样的**文字按钮**。 ### 变更 - **「与远端一致」文案更准确**:工作区还有没提交的改动时改为 「与远端一致,但有未提交的改动」(而且不标绿)—— `ahead = behind = 0` 只说明**已提交的部分** 对齐了,原来那句话会让人以为可以关电脑了。 - **面板不再显示可编辑的远端地址**(配置归设置页);`renderRepo` 与 `safeRemoteUrl` 一并删除, 面板渲染少一次 `getRemoteUrl()`。 - 「最近提交」页里那行与标签同名的标题删掉(多余)。 - 远端地址的校验逻辑抽到 `features/sync/remoteUrl.ts`(输入框与命令面板的「编辑远端地址」弹窗共用)。 ### 修复 - **`Setting.setClass("a b")` 会抛 `InvalidCharacterError`**(它走 `classList.add`,一次只能一个 类名)—— 真机上整页设置渲染不出来。测试替身现在照真机那样抛错,同样的错在单测里就会红。 - **面板按钮的悬停效果**:上一版给所有按钮换了浅底,把「立即同步」(强调色填充 + 白字)也一起改了, 悬停时变成浅底白字、整颗糊掉;现在主按钮用自己的强调色悬停色。 - **diff 内容框的高度限制**:`.obsync-diff-body` 上那条 `max-height: 68vh` 是弹窗时代留下的, 改成标签页之后变成「框里一条滚动轴、框下空一片」;去掉之后整页滚一条轴。 - **`与远端一致` 那一行与倒计时胶囊没对齐**(段落自带外边距),现在两者中线一致。 - 工具条的 padding 从 16px 收到 8px —— 侧边栏窄一点就不得不换行。
最后提交信息为:
release: 0.1.9 —— 仓库同步面板与设置页的一批可用性改动
0.1.8
对比
烛知知
2026-09-25 12:43
0.1.8
f3f76f9
### 新增 - **图片管理面板里可以单独重命名一张图了。** 列表每一行右侧多了一颗铅笔按钮 (只有图标,悬停能看到说明),点开只有一个输入框、预填当前文件名。 它与底部那颗「批量重命名」是**两条路**,别合并:那颗管的是「勾选了一批」、 走模板;这颗管的是「就这一张」。改一张图的名字不该要求先勾上它 —— 那一勾 会让底下一排批量按钮亮起来,界面在暗示一个用户没打算做的批量操作。 规则与批量一致:**目录不变**(输入的是文件名,不是路径),不写扩展名就沿用 原来的,写出的扩展名必须与原扩展名相同(改名不改内容,真要换容器请在编辑 弹窗里做)。仍然走 Obsidian 的官方改名入口,所以**笔记里的链接会跟着更新**。 - **点列表里的缩略图可以放大看。** 缩略图只有 30px,看不清「这到底是张什么图」—— 而它恰恰是判断一张图能不能删之前要看的东西。点它就地弹出预览(**不离开面板**, Esc 或点外部关闭),图下面一行给出路径、体积与三个状态徽标;「已链接」徽标 悬停能看到是谁在引用它。 弹窗里可以**缩放**:工具条上有缩小 / 重置 / 放大三颗按钮与当前倍率读数 (25% – 400%,**滚轮直接缩放**,到头了按钮会灰掉)。100% 的含义是 「图片**完整**装进窗口」,不是原始像素 1:1 —— 一张 6000px 的原图按 1:1 打开 只会看到中间一小块。 放大时**弹窗整体跟着变大**,直到窗口的上限;到上限之后图片还更大,工具条上会 出现「可拖动」的提示,按住图片拖动就能看到其余部分。全程没有滚动条。 没有用 Obsidian 的「打开文件」:那会把图开成一个**标签页**,用户得关掉它才能 回到面板,而看缩略图这件事发生在「连续扫一列图」的过程里,每看一眼切一次 标签页会把动作打断成两半。 ### 变更 - **图片管理面板底部那颗按钮从「重命名…」改成「批量重命名」。** 它管的是「勾选了一批」, 而省略号在这一排按钮里**只有它带**(旁边「同步选中」「压缩并同步」「删除本地」都没有), 于是它看起来不像约定、更像漏了个字;真正需要说清的是**作用范围**, 而那正是行内那颗铅笔(「重命名这个文件」)不表达的东西。 ### 修复 - **「仓库同步」设置页里 `.gitignore` 代码框的宽度**。它此前只靠样式表里的一条 `width: 100%`,而插件样式表**不保证**在热重载时被重新读入 —— 于是改了 CSS、 界面却没变,框缩回了右侧那几百像素。现在宽度与 `box-sizing` 直接写在元素上 (用审核规则放行的形态),不再依赖样式表。 ---
最后提交信息为:
feat(images): 单张重命名、缩略图预览与缩放,并修回 .gitignore 代码框的全宽
0.1.7
对比
烛知知
2026-09-25 00:37
0.1.7
2f5d027
### 新增 - **图片管理面板**(命令「SyncHub:打开图片管理」、侧栏图片图标,或「图片同步」设置页里的按钮)。 它把三件互相独立的事实摊平成一张可筛选的列表:**本地有哪些图**、 **云端有哪些图**、**哪些图被笔记 / 画布 / Excalidraw 引用着**。 三条轴可以任意组合筛选(有 / 无),于是常见的几类清理一次就能选出来: | 想做的事 | 筛法 | | --- | --- | | 把没传上去的补上 | 本地 = 有,云端 = 无 | | 清理失联图片(没人引用的) | 已链接 = 无,本地 = 有 | | 处理只留在云端的 | 本地 = 无 | | 压缩占体积的大图 | 最小体积 + 按体积排序 | 列表里每行显示缩略图、路径、体积与三个状态徽标(「已链接」的徽标悬停能看到 **是谁在引用它** —— 判断一张图能不能删时这是决定性信息)。 批量操作: - **同步选中** —— 缺哪边补哪边(上传与下载都走这一条)。 - **压缩并同步** —— 按设置页的质量 / 最长边重编码,**保持原格式**, 而且**只在变小的时候才写回**(已经压过的图再压一次往往更大)。 - **重命名** —— 模板式(`{name}` `{n}` `{ext}` `{date}`),带实时预览。 会走 Obsidian 的官方改名入口,所以**笔记里的链接会跟着更新**; 模板改了扩展名的那几条会被跳过(改名不改内容,换容器请在编辑弹窗里做)。 - **删除本地** / **删除本地 + 云端** —— 前者会同时记下「这张别再同步回来」 (否则镜像逻辑下一轮就把它下载回来,看起来像删除没生效); 后者会真的删掉云端那一份,弹窗里明确写了**云端没有回收站**。 「云端」这一维读不到时(没配 R2、网络不通、桶权限不对)面板**照常可用**, 只是会在顶部明确说明「云端这一列不可信」—— 不说的话「云端一张都没有」 会被当真,进而让人放心地把本地全删了。 - **Excalidraw 画布里的图片引用也能被认出来**。Excalidraw 把画布数据用 LZString 压缩后写进 `.excalidraw.md`,压缩之后图片的 `fileId` 在文件正文里 **一个字都搜不到** —— 靠正则扫文本会得出「这张图没人引用」,于是清理失联 图片会把它删掉。现在会解压场景再扫,并且**解压前先剥掉换行** (插件把 base64 每 256 个字符折一次行,不剥就解不开,而且不会报错)。 - **差异视图** —— 仓库同步面板上每个文件、每条提交都能点开看改了什么。 - 入口有三处:面板里**每一行文件**(含冲突行)、**每条提交**、以及命令面板的 「SyncHub:查看当前文件的差异」。三条路打开的是同一个弹窗。 - 同一个文件的**工作区改动**与**已暂存改动**分开两节显示。`git status` 里的 `MM` 意味着两边都有内容,只给一边等于把另一半藏起来 —— 而用户点开差异的 意图恰恰是「我到底改了什么」。 - 逐行给**新旧两个行号**,增删分别上色,`@@` 段落头保留(长 diff 里靠它定位)。 - 未跟踪的新文件 git 不产出任何 diff,这里把内容读出来当成「全部新增」显示 (库里新写的笔记正是最想看的那一类);文件太大(>256 KB)则不读进内存, 只说「文件太大」。二进制文件、纯重命名、内容被截断各自有明确说明 —— 一片空白会被读成「没有改动」,而那是完全不同的结论。 - 合并提交也能看:git 默认对合并提交不输出差异,这里按「与第一父提交比较」 取内容,否则历史里点开一次拉取产生的合并提交只会是空白。 - 中文与含空格的路径不会被转义成八进制(`\344\270\255`)—— 关掉了 `core.quotePath`,否则库里的中文文件名在差异里读不出来。 - **「仓库同步」设置页里可以直接编辑 `.gitignore`**,不用再另开编辑器 (也支持「在编辑器中打开」,两条路都留着)。 多行代码框显示当前内容,配一个状态徽标(已保存 / 有未保存的修改 / 尚未创建) 与三个按钮:**保存**、**填入默认内容**(只填进框里,不直接覆盖 —— 覆盖掉 用户自己的规则是数据损失,要让他先看一眼)、**在编辑器中打开**。 改动在**失焦时也会保存**,所以点到别处不会丢;文件不存在时**不会自动创建** (打开设置页不该往库里多出一个文件)。 「在编辑器中打开」走不通时会**明说**(Obsidian 的库索引里不一定有以点开头的 文件,那时点了会什么也不发生)并把用户指回这个框 —— 一个点了没反应的按钮 比没有按钮更糟。 把它放进设置页而不是只留一条命令:`.gitignore` 不是「一个顺带的文件」, 它决定哪些文件根本不进版本控制(`workspace.json` 那种每次开关标签都变的 文件,不同步它是避免多设备冲突的关键)。而此前唯一的入口在命令面板里 —— **只有已经知道有这个功能的人才找得到**。 ### 变更 - **图片管理面板从弹窗改为主工作区的标签页**(命令「SyncHub:打开图片管理」、 侧栏图片图标、「图片同步」设置页里的按钮,三条路都打开标签页)。 整理图片时常常要**一边看着笔记一边决定哪张能删**,而弹窗把整个库盖住, 只能二选一。标签页可以并排在笔记旁边。已经开着时再点入口只会把它显示出来, 不会开出第二个(两个标签页扫的是同一批图,每扫一遍要好几秒)。列表高度 **自适应页面**:表格吃满筛选区与操作栏之外的剩余高度、内部滚动,两块操作区 始终可见。 - **「删除本地图片时,询问是否同时删除云端备份」从开关改成下拉**,三档可选: | 选项 | 行为 | | --- | --- | | 询问用户(默认) | 与原来的「开着」完全一致:弹一次窗,删 / 留由你定 | | 永远同步云端 | 一次都不问:删本地时直接连云端备份一起删(R2 没有回收站,删掉不可逆) | | 永不同步云端 | 与原来的「关掉」完全一致:云端永远不动 —— 但那一份会被下一次同步**下载回本地** | 升级时旧开关的值会接过来(原来的「开」→ 询问用户,「关」→ 永不同步云端), **不改变任何人的现有行为**。 - **受管图片文件夹的默认值改为「仓库根目录」**(即整个库,`.`)。这个插件服务的 场景就是「库本身是一个 git 仓库、图片要有云端副本」,而用户已经用 git 管着整个库 —— 要更窄的范围(比如只同步 `attachments/`)改那一格即可。**已有安装不受影响** (`data.json` 里是什么就是什么),想用新默认的按一下「恢复默认」。 「受管的图片文件夹」下面多了一行操作: - **浏览…** —— 列出库里的全部文件夹(可搜索,根目录排最前,已经在受管范围里的 会标注)。手打路径的错法(`/attachments/`、`assets//img`、不存在的目录) 全都没有提示,从现成的文件夹里挑一次性消掉它们。 - **恢复默认** —— 一键回到仓库根目录;已经是默认值时按钮是灰的。 - **状态栏在没有状态可显示时改为显示本地化的面板名**(原来是写死的品牌名 `SyncHub`)。英文界面下那句原来也是品牌名,现在跟着界面语言走。 - **`.gitignore` 模板按本库的配置目录名展开**,不再写死 `.obsidian`。 配置目录是可以改名的(Obsidian 官方也支持),写死的话那几条排除规则 **一条都匹配不上** —— 表现是「明明建了 `.gitignore`,`workspace.json` 还是被同步出去了」,而用户完全看不出为什么。 ### 修复 - 修好「图片管理改成标签页之后,列表里看不到缩略图」:Obsidian 的 app.css 里有 一条 `.workspace-leaf-content img:not([width]) { max-width: 100% }`,**只对 leaf 里的图片生效** —— 弹窗不在 leaf 里,所以以前从来没这个问题。表格是自动 布局,路径那一列带着 `max-width: 0`(要靠省略号收尾),窄标签页里单元格会被 挤到接近 0 宽,这条 max-width 于是让缩略图跟着缩到 0,整列消失。现在尺寸同时 写成 HTML `width` / `height` 属性(选择器因此不再匹配),实际尺寸仍由 CSS 的 em 值决定。 - 修好「填 `.`(整个库)」这个设置在**重新加载插件后丢失**的问题:归一函数把 「整个库」的规范形状当成了空行丢掉,于是重启后变回「什么都没管」, 「立即同步」还会报「还没有指定文件夹」。手改坏 `folders`(写成字符串 / 数字 / 对象)时也一样 —— 它会被默认值兜底,而现在默认值是整个库,那等于一次手滑 变成「同步全部」;现在坏形状一律退到空列表并提示。 - 修好「删掉本地图片后选择保留云端备份」这条路径(`keepRemoteBackup` 被 `markLocalDeleted` 取代之后调用方没跟上,9 条用例因此是红的)。 顺带把墓碑的记账时机提前到**询问之前**:攒批的几百毫秒里如果正好有一轮 同步在跑,它会把用户刚删掉的图当作「云端有、本地没有」补齐回来。 - 修好差异视图**少显示一行**的问题:内容本身以 `-- ` 开头的行,删掉之后产出的是 `--- xxx` —— 与 unified diff 的文件头**长得一模一样**,按行首判断就会被当成 段落头吞掉(表现为界面上少一行、行号与文件对不上)。现在按「是否已经进入 hunk」 判断,并有一条用例专门钉住这个形态(去掉守卫后只有它会红)。 - 修好「`.gitignore` 编辑框只占右侧一小块」:它原来是设置项的**控件**, 而 Obsidian 的控件区是给「一个下拉 / 一个输入框」留的宽度(几百像素), 十几行规则挤在里面根本没法读。现在它是直接挂在页面上的**全宽块级代码框**。 - 「在编辑器中打开 .gitignore」打不开时会**明说**(Obsidian 的库索引里不一定有 以点开头的文件,那时点了什么也不会发生),并把用户指回设置页那个能直接改的框 —— 一个点了没反应的按钮比没有按钮更糟。 ### 内部 - **按社区审核规范(`eslint-plugin-obsidianmd`)做了一轮复查**,修掉 17 处: 静态导入 `node:os`(改成 `Platform.isDesktop` 守卫内的 `require`)、 `console.info`(审核的 `no-console` 只放行 debug / warn / error)、 `setTimeout` / `clearTimeout` 未走 `window`(弹出窗口下行为不一致)、 `document.createElement`(改用 `createDiv` / `createEl`)、 写死的配置目录路径,以及**直接写内联样式**(`el.style.width = "…"` —— 审核把它算作 error,`setCssProps({ width })` 同样不行:那条规则只放行 `--*` 自定义属性,静态宽度必须待在 CSS 类里)。 剩 1 条 `settings-tab/prefer-setting-definitions` 是**有意保留**的: 设置页整体是手写渲染的,迁到 1.13 的声明式 API 是一次独立的改造。 ---
最后提交信息为:
chore(release): 0.1.7
0.1.6
对比
烛知知
2026-09-22 00:20
0.1.6
51c225d
### 修复 - **插件 id 回退为 `ob-sync`**(0.1.5 里改成了 `synchub`)—— 社区审核报 *The plugin ID in (manifest.json) does not match the existing plugin ID*: **审核系统在 0.1.4 那次提交时就把本插件登记为 `ob-sync`**,之后改 id 就与既有登记不匹配。 显示名 **SyncHub 保持不变**(商标那条已经过了,本次审核没有再报名字问题)。 所以最终形态是:**显示名 `SyncHub` + id `ob-sync`** —— 两者不一致是**有意的**: 审核登记决定 id,商标规则决定显示名,来源不同,不必也不该统一。 **升级注意(如果你装过 0.1.5)**:安装目录会从 `.obsidian/plugins/synchub/` 回到 `.obsidian/plugins/ob-sync/`, 请把 `data.json` 复制回去(否则会以默认设置启动),并删掉 `synchub/` 目录。 **访问令牌始终不受影响**:它们存在 `obsync-token-*` 这个密钥 id 下, 与插件 id 无关 —— 这一来一回都没有作废过凭据。 ---
最后提交信息为:
chore(release): 0.1.6
0.1.5
对比
烛知知
2026-09-22 00:04
0.1.5
6379422
### 变更 - **插件名从 `OBSync` 改为 `SyncHub`** —— 社区审核以 *Plugin name must not include parts of the name "Obsidian"* 打回。 原因不是"含 Obsidian 这个词"(`OBSync` 并不含),而是它以**全大写 `OBS`** 开头 —— 那正是 "Obsidian" 前三字母的缩写写法,规则查的是商标的**片段**。 实测佐证:插件目录 7884 个已上架插件里,**没有任何一个**显示名含全大写 `OBS`; 而含 `Obs` / `obs` / `Ob` 的各种写法都大量在架(`WeChat Obsync`、`Tree Obs`、 `ObShare`、`GitHobs`…)。 改动范围:`manifest.json` 的 `name`、状态栏文案、命令名、i18n 文案、README, 以及**自我更新的仓库坐标**(GitHub / Gitee 仓库同步改名为 `SyncHub`)。 **那些 `obsync-` 前缀的内部标识一律不动** —— CSS 类名、`obsync-sync-view` 视图类型、`obsync-token-` 密钥 id 各有各的命名空间,跟着改只会白白作废用户 已存的令牌与面板状态。 **升级注意**:仓库改名后 GitHub 会自动重定向旧地址,自我更新不受影响。 但若你把设置页的「自身更新来源」手填成了 `.../OBSync`,需要改成 `.../SyncHub`。 - **插件 id 从 `ob-sync` 改为 `synchub`** —— 与显示名统一。 **这不是审核要求的**:商标规则只管显示名,目录里 `obsync-ptop`、 `obsync-webdav-gpg` 等一大批 id 含 `obsync` 照旧在架。改它是因为**现在最便宜** —— 插件尚未上架,全世界的安装只有作者自己的库,迁移成本只有那几处; 等上架之后再改,代价就是所有用户的数据。 **升级注意(重要)**:Obsidian 按 id 找插件,安装目录会从 `.obsidian/plugins/ob-sync/` 变成 `.obsidian/plugins/synchub/`, 而 `data.json`(设置 + 跟踪列表)**不会自动跟着走** —— 需要手动把它复制到新目录, 否则插件会以默认设置启动。旧的 `ob-sync/` 目录可以删掉, 否则插件列表里可能出现两份。 **已存的访问令牌不受影响**:它们存在 `obsync-token-*` 这个密钥 id 下, 与插件 id 无关(这正是内部前缀刻意不改的价值)。 **跨 id 这一跳不能靠自我更新**:旧安装里的自我更新会校验远端 manifest 的 id, 而远端已是 `synchub`,校验不通过就会**拒绝写盘**(这道守卫本就是为了防止 覆盖别的插件)。所以需要**手动重装**一次;重装后两边 id 一致,自我更新恢复正常。 ### 修复 - **英文界面的 `.gitignore` 模板漏了排除本插件自己的 `data.json`** —— 中文模板一直有这条(本插件的设置是按设备的,同步它只会让两台设备互相覆盖设置), 英文模板却**没有**,于是英文用户初始化仓库时写出的 `.gitignore` 不会排除它。 i18n 的编译期检查只管**键结构**、不管字符串内容,所以这条漂移长期没被发现。 已补齐,中英模板现在一致。 ---
最后提交信息为:
chore(release): 0.1.5
0.1.4
对比
烛知知
2026-09-20 23:12
0.1.4
be7f753
### 变更 - **插件 id 从 `obsync` 改为 `ob-sync`** —— 插件市场里 `obsync` 已被别的插件占用, id 撞车的插件无法上架。插件名仍是 **OBSync**,功能与设置项一个没少。 只动了「插件身份」这一处:`manifest.json` 的 `id`、自我更新时校验远端身份用的 常量,以及它们派生出来的东西(`.gitignore` 模板里的设置文件路径、安装目录)。 那些 `obsync-` 前缀的内部标识**刻意不动** —— CSS 类名、`obsync-sync-view` 视图 类型、`obsync-token-` 密钥 id 各有各的命名空间,跟着改只会白白作废用户已存的 令牌与面板状态。 **升级注意**:Obsidian 按 id 找插件,所以目录会从 `.obsidian/plugins/obsync/` 变成 `.obsidian/plugins/ob-sync/`。旧目录要手动删掉, 否则库里会同时存在两份(同一个名字、两个 id),插件列表里会出现两个 OBSync。 旧的 `data.json`(设置与跟踪列表)不会自动搬过去,需要重新配置。 ---
最后提交信息为:
chore(release): 0.1.4
0.1.3
对比
烛知知
2026-09-20 07:38
0.1.3
9aa55e5
### 新增 - **可以指定自身更新的来源** —— 设置页「OBSync 自身」一节新增「自身更新来源」。 留空走官方仓库;国内访问 GitHub 慢或被阻断时,填 Gitee 镜像的地址 (例如 `https://gitee.com/sofqi/OBSync`),**填一次就一直用它,不再自动探测**。 检查与更新用的是**同一个来源**(不会出现「检查说没有更新、更新却从另一个仓库拉」); 地址非法时明确报错,而不是悄悄回退到官方。更新前仍然校验远端 manifest 的 `id`, 所以地址填错不会覆盖别的插件。 在这之前,想从镜像更新自己只能绕道「添加插件仓库」把自己加进跟踪列表 —— 而那条路会**先禁用正在运行的这个插件再重新启用**,中途失败就停在「已禁用」, 重启也回不来。所以这个入口不只是方便,它把一件本来只能危险地做成的事变安全了。 ### 内部 - 修掉一处「跨 host 传参会丢 host」的隐患:`formatRepoId` 只给 `owner/repo`, 跨 host 传递时必须另传 `defaultHost`,否则 Gitee 的坐标会被按 GitHub 解析 —— 而界面看起来毫无异常 ---
最后提交信息为:
chore(release): 0.1.3
0.1.2
对比
烛知知
2026-09-20 01:20
0.1.2
dd5e0f4
侧边栏的同步面板从「一个标题 + 四个按钮 + 一串文件名」变成了**真正的 git 详情面板**; 插件安装补上了**回退到指定版本**的能力;另外修掉几个会把人指错方向的报错。 ### 新增 **笔记仓库同步** - **仓库同步视图**(侧边栏):侧栏的 git 图标、点状态栏条目,或命令 **OBSync:打开仓库同步面板**。里面有:顶部**一行**工具条(提交 / 拉取 / 推送 / 分支下拉 / **靠右的**立即同步 / **最右的**刷新)、远端地址(**脱敏**后回显)+ 编辑入口、 `领先 / 落后远端`、**并排两栏**的仓库大小与待提交改动、冲突区(列出冲突文件 + 放弃合并)、按「已暂存 / 更改」分组的文件列表(逐个文件暂存 / 取消暂存、 点文件名打开笔记、在远端打开此文件)、最近 10 条提交(点 hash 在远端查看)。 不是 git 仓库时这里直接给「初始化仓库」按钮。面板是**活的**:自动提交、库外改动、 命令面板里的动作都会让它自己刷新 - **展示仓库体积**(松散 + pack 对象 + 对象数)与**待提交改动体积**。 **读不到时说「读不到」,不显示 `0 B`** —— 0 B 会被当成「空仓库」,那是个错误结论 - **「与远端一致」的醒目反馈**:提交/同步结束且本地与远端完全一致时,给一条带 ✓、 停留更久的提示(附仓库大小),同时状态栏出现 `✓`、面板里那一行转绿。 三处用的是**同一个判据**。关掉「显示操作结果提示」的人看不到提示, 但状态栏与面板仍然显示这个状态 - **「立即同步」为什么包含拉取**写进了 README:git 的 `push` 只能**快进**,远端有你 没有的提交时会被直接拒绝 —— 而这个插件的用途就是多设备同步,所以「提交 → 推送」 在两台设备上是**稳定失败**,不是偶发失败 **社区插件与主题** - **切换版本(回退)**:跟踪列表里新增「版本管理」按钮(**只有插件有** —— 主题在设计上 就没有版本钉选)。弹窗列出该仓库已发布的版本、标出「当前」那一版、**默认选中你之前 钉住的那一版**(而不是最新),选完即切过去。列表上会挂「已固定 \<tag\>」徽标 - **进度看得见**:长耗时动作的图标换成会转的 `loader`,并给带圆环的逐文件进度提示 (「Trefoil:正在获取 main.js…」) - **换下载来源**:版本弹窗里可探测并改用 Gitee 镜像;探不到时也能**手填**镜像地址 (用 manifest 的 `id` 校验,不一致直接拒绝) - **疑似镜像必须由你确认才采用**:确认页把两个地址做成**可点开的链接**,方便你去核对 **设置页** - 「通用」标签新增**状态栏占满整屏宽**(默认开着)。同步条目要贴在状态栏最左侧, 而状态栏原本收缩在右下 —— 左边没有空位,唯一办法是把它拉成全屏宽 - 「仓库同步」标题下新增**注意事项**(见下方 `reset` 那一条) ### 变更 - **视图改名**:「源码控制」→「仓库同步」。面板内那个重复的标题删掉了 —— 标签页上已经写着视图名。命令名、状态栏悬停文案、侧栏图标标题一并跟上 - **工具条从三行并成一行**(原来标题一行、动作一行、分支一行) - **删掉「重装」按钮**:它与「版本管理」做的事**逐字相同**(同一个 `install()` 调用、 同一组参数),留着只是让人猜该点哪个。圆箭头图标还给「检查更新」(本来就是它的) - **「提交全部」改名「提交」**(行为不变,仍是暂存全部 + 提交;命令面板里那条仍叫 「提交全部更改」—— 那里空间够) - **`reset` 策略与自动同步互斥**:选「重置」作为拉取整合策略时,**自动同步会被暂停** (开关灰掉并说明原因)。因为同步链路是「提交 → 拉取 → 推送」,而重置会把刚提交的 内容丢掉 —— 两者叠在一起,每 N 分钟就**静默地**丢一次。改回「合并」或「变基」后 自动恢复,不用重新拨开关 ### 修复 - **「推送」与「提交」的区别没写在界面上** —— 用户是问了才知道的,说明没写清楚。 现在三个动作按钮都有悬停提示,且推送时按状态各说一句。其中最关键的一条: 有未提交改动时说**「你有 N 个改动还没提交」** —— 原来这种情况说成「没有需要推送的 内容」,听起来像「一切正常」,而真实情况是「你的改动一个都没上去」 - **「一直看到正在推送」** —— 状态栏的活动态**没有终点**:`setActivity("idle")` 这个 调用在 `src` 里从未出现过,于是动作结束后状态栏永远停在「正在推送…」, 连分支和 ahead/behind 都不再显示,直到重载插件 - **git 可能真的在等人回答** —— 拿不到凭据时 git 会提问,而 Obsidian 里没人能回答, 命令挂着、后面所有同步排队等它。现在禁掉「问人」(**不禁「用凭据」**,已存的照常用), 并给一个**无输出超时**(120 秒,传输有输出就重置) - **从 Gitee 镜像装插件的资产全 404** —— Gitee 的资产 JSON 里**没有 `id` 字段**, 而代码写的是 `String(asset.id)`:缺字段时得到字符串 `"undefined"`,**它是真值**, 于是拼出 `.../attach_files/undefined/download`。症状只出现在**配了 Gitee 令牌**的人 身上(那条分支要 token 才进)。现在缺字段就保持缺席,附件端点失败时回落到公开下载地址 - **「装不上、报缺 main.js」** —— 资产通道的「短路」写宽了作用范围:第一个文件传输 失败后,后续文件被**跳过资产通道**只去源码里找,而 `main.js` 是构建产物、仓库里没有, 于是「源码里找不到」被当成「这个插件缺 main.js」。同一处还让 `styles.css` 被静默跳过 ——**能装出一个没有样式的插件**,界面是坏的且没有任何提示 - **「更新完还报可更新」的死循环** —— 记录被抹成了空版本 - **「插件版本被退回而 OBSync 还说已是最新」** —— 让记录与磁盘对上,并优先听 Obsidian - **镜像发现只探「同名 owner」** —— 挂在作者自己 Gitee 账号下的镜像永远找不到 - **`.gitignore` 模板漏了 `.obsidian/plugins/obsync/data.json`** —— 初始化仓库时建的 `.gitignore` 里缺这条,而它是**按设备**的设置,跨设备同步只会互相覆盖 ### 内部 - **`pnpm verify:head`**:在 **HEAD**(而不是工作区)上跑测试。`pnpm test` 读的是工作区, 所以「本地全绿」说明不了 HEAD 是绿的 —— 而 HEAD 才是别人克隆时看到的 - **`pre-push` hook**(`pnpm hooks:install` 启用):push 前自动跑一次上面的检查, HEAD 红了就拦住 - 838 条单元测试(55 个文件) - 交接文档新增五点七(版本管理)与五点八(仓库同步视图)两节 ---
最后提交信息为:
chore(release): 0.1.2
0.1.1
对比
烛知知
2026-09-19 00:16
0.1.1
2f1ac07
OBSync 把两件事合在一起,并且让它们都**不只认 GitHub**:**用 git 同步笔记仓库** + **安装社区插件与主题**,两个功能共用一层平台适配,所以 GitHub 与 Gitee 的差别只实现一次。界面中文优先、英文对等。 首个公开发布版(0.1.1)。 ## 主要能力 - **笔记仓库同步** —— 提交 → 拉取 → 推送一条链走完;也可以单独执行。冲突**不替你决定**:写一份《OBSync 冲突指南.md》列出冲突文件并立即停止同步链(继续提交会把冲突标记写进历史) - **自动同步**(默认关闭)—— 自动提交 / 推送 / 拉取三个间隔,计时基于上次执行时间并存进库级存储,重启不重置周期、多个库互不干扰 - **源码控制视图 + 状态栏条目** —— 分支、ahead/behind、变更与冲突列表,逐个文件暂存 / 取消暂存;状态栏条目贴在**最左侧**(刻意如此:它回答「现在同步到哪了」,不该藏在右下角) - **连接测试** —— git 可用 → 已初始化 → 有远端 → 平台可识别 → **真的连一次远端**,逐条给出结果,并说明它只证明「读取」 - **在远端打开** —— 当前文件 / 它的历史 / 文件右键菜单,GitHub 与 Gitee 各按平台拼链接 - **插件与主题安装** —— 填 `owner/repo` 或粘贴完整链接(双平台识别);**release 资产**与**仓库源码文件**两条通道(Gitee 上大多数插件没有 release,这条通道是必需的);版本选择、预发布回退、写入前备份 + 失败整体回滚 - **更新检查** —— 单个 / 全部 / 启动后 / 进入设置页时(可关),有更新的行常驻徽标;**只检查并提示,安装永远手动** - **跟踪列表** —— 检查、更新、重装、冻结、打开仓库页、取消绑定(**只移出列表,不删文件**);库里已装的插件与主题可以一次性绑定进来 - **Gitee 镜像发现**(默认关闭)—— 探测同名镜像并用两边 manifest 的 `id` 二次校验;命中后列表**同时显示源仓库与镜像** - **OBSync 自身更新** —— 设置页里检查并更新它自己 ## 本版修复(节选) - 装完新插件后「已跟踪」列表不刷新(要手动点一次「检查全部更新」才出现) - 状态栏条目不在最左,且会把其他插件的条目挤走一个条目的宽度 - 更新 / 重装 / 安装后的提示不说明来源(现在报 `来源:GitHub` 或 `来源:Gitee 镜像`) - 更新检查永远报「已是最新」(检查路径比安装路径少做两件事,私有仓库与只发预发布版的仓库因此永远收不到提示) - Gitee 的令牌会随错误消息漏出去(屏幕提示与控制台日志,已全面脱敏) - Gitee 私有仓库必然被拒(Basic 认证用户名填成了 `git`,而 Gitee 只接受账号名 / `oauth2` / `gitee.com`) - 冲突标记会被提交进历史;取消绑定会删掉插件目录;移动端启用即崩 - 「识别」按钮永远是灰的;库根路径被 `normalizePath` 剥成相对路径(macOS / Linux 连不上仓库) - 22 处错误文案硬编码中文;7 个 i18n 键写了却没接上 完整列表见 [CHANGELOG.md](https://github.com/Dyse-Sofqi/OBSync/blob/main/CHANGELOG.md)。 ## 安装 下载下面的 `main.js`、`manifest.json`、`styles.css` 三个文件,放进 `<你的库>/.obsidian/plugins/obsync/`,然后在 Obsidian 的「第三方插件」里启用。 ## 要求 - Obsidian **≥ 1.8.7** - 笔记同步需要系统 git,**仅桌面端**;插件与主题安装是纯网络操作,移动端也能用 - 用一个 **Gitee 访问令牌**体验会好很多(Gitee 匿名 API 配额实测极低,无令牌时会降级到源码通道) ## 已知限制 - 同步只支持桌面端(移动端没有系统 git) - 主题:支持**绑定库里已装的主题并更新**,不支持从仓库新装;不做版本钉选与主题 beta 通道 - Gitee 镜像发现只认「同 owner 同名」的仓库,多数镜像挂在别的账号下,因此默认关闭 - 逐文件暂存之外的 diff 查看、行作者等 obsidian-git 增强功能不在本版范围内 --- OBSync bundles two things and refuses to be GitHub-only: **vault sync over git** and **community plugin & theme installation**, sharing a single platform layer so every GitHub/Gitee difference is implemented once. Chinese-first UI with an equal English one. First public release (0.1.1). Highlights: commit → pull → push in one chain with conflict guides instead of auto-resolution · auto-sync timers that survive restarts · source-control view and a status-bar item pinned to the far left · a connection test that actually talks to the remote · install from GitHub *or* Gitee with release-asset **and** repository-source channels · update checks that only report (installing is always manual) · adopt already-installed plugins and themes · self-update. Requires Obsidian ≥ 1.8.7. Vault sync is desktop-only (needs the system `git`); plugin installation works on mobile. See [CHANGELOG.md](https://github.com/Dyse-Sofqi/OBSync/blob/main/CHANGELOG.md) for the full list.
最后提交信息为:
chore(release): 0.1.1
下载
请输入验证码,防止盗链导致资源被占用
取消
下载
1
https://gitee.com/sofqi/SyncHub.git
git@gitee.com:sofqi/SyncHub.git
sofqi
SyncHub
SyncHub
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册