用github上的分支更新 Remotely Save 插件 目前进度:支持同步书签

2023.5.5 更新

  • 加入了文件变更后立刻同步的选项

2023.5.7 更新

原本只是想拉分支代码下来编译一下用,现已变成动手改代码维护插件,可喜可贺可喜可贺 :smiling_face_with_tear:

  • 加入了同步书签文件 "/bookmarks.json" 的功能
  • 加入了更多关于同步时间的选项

原文

Remotely Save 插件上一次更新已经是一年前。在这一年间 github 的 Remotely Save 仓库其实收到了一些的合并请求,有一些通过了但是并没有被发布,有一些则被自己关闭了合并请求。

太长不看版

分支加入了

  1. 支持在文件变更后触发定时同步

  2. 在状态栏上面显示同步状态

两个功能,但是同时引入了若干Bug(……)

如果想要用的话可以使用我编译好(并且修改了我认为是Bug的部分)文件,直接跳转到使用需知部分即可。

分支功能

在其中我发现了 alvin-7/remotely-save 仓库的合并请求。这个仓库比原版增加了 7 次提交,根据提交日志,除了合并请求添加的 support auto save after file modified by alvin-7,还合并了 Added Status Bar Item by Drumber 的提交。因此这个仓库的版本也就同时多了以下功能:

  1. 支持在文件变更后触发定时同步

  2. 在状态栏上面显示同步状态

关于文件变更的原理,核心代码在这里


if (this.settings.autoRunAfterModified) {

if (time > 0) {

this.onFileModifyEventRef = this.app.vault.on("modify", () => this.autoBackupDebouncer());

this.autoBackupDebouncer = debounce(() => this.syncRun("auto"), time, true);

}

} else if (time > 0) {

this.timeoutIDBackup = window.setTimeout(() => this.syncRun("auto"), time);

}

其中 time 这个属性是设置项中的自动运行间隔

可以看出这个代码的逻辑并非通常理解的在每次文件变更后触发一次同步,而是在变更后开始计时,直到经过 自动运行间隔 的时间没有新的变更产生后才会进行一次同步。

函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间。

所以这个功能本质上防止用户一直开着Obsidian却没有编辑,定时同步依然在运行浪费了太多流量吧…

但是很奇怪的是它首先并没有停止原来的自动定时,使用的却是原本的自动的同步时间,甚至把原本有的 运行中变更自动同步时间时重置的功能给去掉了。也就是说当开启了这个选项后会同时在编辑之后的指定时间运行 并且 每隔指定时间还会再运行一遍。说实话我不太理解这个设计是特意进行的还是Bug,所以我把它改掉了(……)。

另一个功能状态栏显示同步状态就很好理解,开启之后会在右下角状态栏上显示一个 一分钟之前同步 这样的信息,如果把鼠标在上面停留一会儿会显示准确的同步时间。

使用需知

需要注意的是,不知道为什么使用了这个插件之后,我原本的阿里云OOS配置中 区域(Regin)的部分不能使用论坛教程中的 oss-cn-hongkong-internal.aliyuncs.com 而只能使用 oss-cn-hongkong-internal 才能连接成功。因为我也不知道这个区域到底是什么意思,所以用其他服务的在用这个版本的插件后可能得自己修改一下。

另一方面,因为这个版本我也没有长时间过,所以也不太清楚有没有什么问题,尤其是文件变更定时同步的部分,会不会触发异常也不是很清楚。建议在第一次打开这个开关后重新启动一次 obsidian 以防万一。

使用方法

alvin-7/remotely-save 的仓库把源码下载下来,并且根据 obsidianmd/obsidian-sample-plugin 中的指示自行编译插件。

在编译的时候可能会报错,这是因为没有把语言本地化的内容下载下来的缘故,把 alvin-7/langs 的内容下载下来全部塞进 src/langs/ 目录下面就可以了。

当然我也知道这个很麻烦(……)

也可以下载我已经编译好的 main.js remotely-save - Gitee.com 文件然后替换掉插件文件夹的 main.js。我修改和补充了一部分翻译,加入了每30s自动运行一次的选项,同时分割了自动同步和修改后同步使用的时间间隔,可以在关闭自动同步的同时使用变更后同步的功能。

由于原本的机制,如果即使你设置了 30s 的间隔,如果你不停地打字中间停下来的时间都没有超过30s,然后迅速地关闭了OB,那么这个插件就不会同步了。理论上来讲应该设置一个上限,变更之后 一分钟或者五分钟 没有同步,就强制同步一遍比较合理。

8 个赞

好帖帮顶,不过应该耗费不了什么流量,毕竟是增量备份。要是能实现livesync就好了。

因为它每次尝试同步的时候,都会去请求云端的整个库所有文件的基础信息,比如创建时间修改时间size之类的,如果库里面东西很多的话不知道量级怎么样……想要到livesync的效果的话倒是很简单,把30秒再缩到1秒就可以了


总之我加入了这个选项,可以试试【

感谢大佬,之前用 webdav 同步的时候有个报错 Invalid response:500 Internal Server Error ,用了您修改的插件之后报错消失了,再次感谢!!

感谢大牛修改插件,之前多平台同步时很多问题都解决了。多谢

谢谢大佬的无私奉献


大佬知道为什么我同步出错了吗:sob:

可能是因为我后来加入同步书签的功能,但是没有检查书签文件是否存在……你随便找个文件添加书签再删掉应该就可以

我的bookmarks.json是存在的啊,可是依然报错了,是不是与我没有打开同步配置文件夹有关啊。

看上去像是服务器里面的Bookmark.json不存在……是不是你云端的Bookmark.json文件不存在……?
不用开那个选项也能够同步书签的

是啊, 我云端也没有.obsidian, 是要开启同步配置文件夹才能同步bookmark吗

不用开也可以同步。
你用什么同步的,我去试一下怎么回事

webdav,用onedrive for bussness 挂载的

还有这种操作……?!
我试了试即使删除了我的云端文件,点同步仍然会同步上去的……
你试试在云端先创建好.obsidian和bookmark文件,然后同步还会不会报错。不会的话修改一下本地的书签,看看能不能同步到云端

成功啦!!:heart_eyes::heart_eyes::heart_eyes::heart_eyes:贴贴大佬

用koofr可以挂载onedrive为webdav, 自己弄的话alist好像也可以

请问大佬可以优化一下通知的形式嘛?
现在每次通知都七八条消息,我认为只有当同步出现了错误才需要提示具体的运行流程。

它现在的形式是手动同步才会跳出一堆通知,自动同步不会跳出来的,我个人的使用习惯觉得这个好像还好?因为启动的时候同步是静默的,关闭的时候跳出一堆通知好像也还好?
不知道你是什么习惯,我再想想能怎么优化

大佬能帮我看一下同步问题出在哪里了吗?从gitee下载main.js替换掉插件原来的文件后,就同步不了了,然后又换了回来,还是不行。


点击鉴权没反应

点击jianc检查还是一样提醒没manually auth

我不太懂one drive 是怎么运作的……但我觉得你可以这样排查
先新建一个干净的库和原版rs看看能不能连接one drive,如果这个地方不行的话换个设备,都不行那感觉是one drive的锅
如果上一步可行的话用替换main.js的文件的rs在另一个干净的库连接one drive 如果不行的话那就是我这边改代码改出什么问题了……
依然可行的话可能是原版直接替换新版造成的,那我觉得你直接把旧的删掉重新同步就好