Logseq自动同步方案和选择

前言

用Logseq作为笔记软件已经差不多快1个月了,目前用下来感觉是非常顺手+贴合日常工作、生活的,相关的笔记使用心得之后再开坑详细说说,今天只打算说一下我用Logseq后数据得同步方案及如何选择的问题。

因为Logseq目前和Obsidian一样都是纯文本形式管理数据的笔记软件,但是Logseq不像OB目前有官方的同步方案,虽然Logseq这边同步方案已经提上日程,但是我等了一个月了还没有Releases的版本,单是应该也快了,每天都有看到Github上有开发人员更新相关的代码,所以到目前为止只能自己想办法。(听说有在开发纯数据库版本的)

另外我这里没有讨论手机端的同步问题,因为我目前在手机上尝试使用Logseq都失败了,所以放弃了。现在只使用手机通过phonetonote插件用tg来发送一些网址,简短记录啥的。

方案

目前我所知的其实总结下来也就三种:Git、文件同步服务、文件协议:

  • Git:通过Git把数据同步到各种Git平台上,如Github、Gitee、Gitlab等。
  • Onedrive、Dropbox、坚果云、iCloud:直接将笔记文件夹整个进行同步。
  • 文件协议,如:webdav、smb等等。

上面有些服务我并没有一一使用体验,我这里就说一下我用过的方案,并做一个总结

文件同步服务类:Onedrive

文件同步服务因为我我只用过Onedrive,所以就只讨论它,但是听说Dropbox有些更新算法很先进,可能不过出现下面说的Onedrive使用过程中遇到的问题。。

因为Onedrive一直以来都是我做多端文件同步的主要手段,之前也写过一些问题解决的文章:windows升级2004Onedrive无法启动解决方案 等。

Onedrive这类同步服务的优点是简单、无感,你只需要把你的文件夹放在Onedrive目录下面即可自动同步你的数据。这类同步程序会自动检测你的文件变化进行选择性的数据上传更新,不用你做任何操作。而且基本上有带有文件历史的功能,如果出现文件修改错误可以很方便的进行回退,且因为都是面向普通消费群体的,所以在使用上通常会比较无脑简单,所以我最开始使用的同步方案就是这个。

不过我在使用Onedrive的时候出现了一个很致命的问题,如果在Logseq中对某个笔记进行内容编辑,Logseq会对文件进行占用和锁定(具体什么原因我没细问,大概是这个意思),而对于这种锁定状态下的文件Onedrive无法进行数据同步及上传,并会在托盘图标处做出提醒。(我还没测试出现这种提示后关闭正在进行编辑的笔记能不能解决占用,如果有测试过的博友可以评论区回复一下)

出现这种情况后当时在另外一台电脑上打开Logseq时,Onedrive会提示你之前锁定的那个文件本地和云端版本不一致,程序无法合并两个文件,并会以 文件+电脑名称 创建一个副本。

这会导致你打开的Logseq中的笔记还停留在你之前在这个电脑上修改的状态(简而言之就是没同步过来),你需要手动打开两文件辨别哪个时新的,或者那些内容需要和合并,并重命名文件,删除掉文件名中的电脑名称。

在Logseq的官方社区、讨论群里也看到过有其他用户出现类似的情况,至于我的推断正确与否还不清楚,反正大概是这个结果。因为担心数据丢失以及时常出现这种我呢提所以我后来放弃了这种方式。

如果能解决或忍受这个问题,并且不想折腾,那么我想这种方案是最适合你的。

文件协议类

我们可以通过工具或系统原生的功能挂载webdav、smb这类windows的文件协议将我们的nas、vps或网盘的空间挂在本地,然后Logseq使用这些挂载好的文件夹、空间用来储存数据。

这种方式我没有深入使用,只使用了RaiDrive挂载Onedrive到本地,但是不知道是我方式不对还是设置不对,读取速度慢的异常,导致logseq出现了很严重的卡顿,所以对这个当时浅尝即止。不过我看到很多网友都是使用的这个方式,所以极大概率是因为我设置的问题。

这个方案可能还有一个问题——没有历史版本,因为是文件协议,所以基本上没办法保留历史版本,如果有些方面需求的朋友要谨慎考虑。

⭐️Git同步(推荐)

这也是官方之前一直默认使用的同步方式,不过由于存在使用门槛,而且因为国内网络环境的问题部分地区可能无法直接访问Github所以官方现在开始做自己的同步服务,并告知用户的他们规划了。

但是这不妨碍他成为Logseq一种相对优秀的同步方案。他基本上解决了Onedrive冲突文件不方便合并的问题,也解决了文件协议这个方式没有历史版本的问题,相反, Git的版本管理强大到离谱。更重要的一点,他是免费的 😬。

在你只需要在这些Git平台创建一个库,并通过Git工具复制到本地,然后把笔记文件夹设置为这个项目即可。

唯一的缺点可能是一点点学习门槛。

我的Git自动同步方案

我目前正在使用的就是Git方案,该如何创建库之类的操作我就不再说了,社群和网上有很多资料,我这里单独说下我是怎么让Git实现多端(多个window间同步)同步,同时解决多端无脑同步的问题

目前Github上有两三个专门针对Logseq写的自动Commit工具,分别是

热心网友写的那个我之前一直出现各种莫名奇妙的问题导致无法提交,所以现在用的是第一个Logseq官方的自动提交脚本。

但是这两个脚本都有一个问题——因为我平时有两个环境,一个公司一个家里。这就导致了我在公司写完笔记回去后在家里需要先进行一次手动的pull操作才能正常自动Commit,这让我觉得巨麻烦,难道就不能判断一下push操作的结果,如果提示不成功就先做下pull的操作同步最新的库再开始自动提交?

所以我试着改动了一下官方脚本的代码,因为不懂powershell的脚本要怎么写,写了下面这段代码,但是一直无法执行。

# 如果带了push参数则进行push操作
if ($PushToServer) {
		# 获取gitpush的执行结果
        [string] $output = (&  git push $Server $Branch)
        # 因为如果本地库和远端库不一致git会提示你需要执行git pull操作,所以这里判断一下执行结果里面有没有git pull,如果有则执行git pull操作
        if($output.Contains("git pull")){
            git pull
       }
    }

我再Logseq的官方QQ群里问了一下,不过大佬们似乎没时间,所以我再V2ex上发了个帖子求教,运气不好很快就得到了解决方法,moen 大佬说:git 的输出是写到 stderr 的,所以得写成  & git push $Server $Branch 2>&1 ,我一改果然成功了。

修改后的代码如下(文件名: Start-GitAutoCommit.ps1  ):

# Usage:
#  git-auto ;; use current script dir as git dir, and Start-GitAutoCommitAnoPpush.
#  git-auto -d /path/to/your/note's/dir   ;; set git dir
#  git-auto -p ;; Start-GitAutoCommitAndPush
#  git-auto -s origin -p ;; set remote server
#  git-auto -b main -p ;; set git branch
#  git-auto -i 30 -p ;; set interval seconds
#  git-auto -o -p;; execute once

# parameters
param (
    [Alias('d')]
    [string] $Dir,
    [Alias('i')]
    [int] $Interval = 20,
    [Alias('p')]
    [switch] $PushToServer = $false,
    [Alias('o')]
    [switch] $Once = $false,
    [Alias('s')]
    [string] $Server,
    [Alias('b')]
    [string] $Branch
)

# if -Dir/-d specified
if ($Dir -ne "") {
    Set-Location $Dir
}

# if -Branch/-b specified
if ($Branch -eq "") {
    $Branch = (& git rev-parse --abbrev-ref HEAD)
}

function Start-GitAutoCommitAndPush {
    [string] $status = (& git status)
    if (!$status.Contains("working tree clean")) {
        git add .
        git commit -m "auto commit"
    }
    if ($PushToServer) {
        [string] $output = (&  git push $Server $Branch 2>&1)        
        if($output.Contains("git pull")){
            git pull
       }
    }
}

Get-Date

if ($Once) {
    Start-GitAutoCommitAndPush
}
else {
    while ($true) {
        Start-GitAutoCommitAndPush
        Start-Sleep -Seconds $Interval
    }
}

另外还写了一个作为调用入口的bat文件,因为这样我才能通过任务计划调用,你可能会问我为啥不直接用计划任务调用ps1文件?我只能告诉你我折腾过,但是失败了,我不会~。

文件名: Auto-Commit.bat  

@echo off
echo "DOCS PUSH BAT"

echo "1. Move to working directory" 
::移动到你的logseq库文件夹内
D:
cd D:\developer\logseq
 
echo "2. Start GitAutoCommit.ps1"

::执行powershell脚本,并设置远程分支和本地分支,并设置每30妙操作一次,并自动push
PowerShell.exe -file Start-GitAutoCommit.ps1 -s origin -b main -i 30 -p
 
echo "Auto Commit Start"

通过计划任务调用这个bat脚本就能实现开机自动后台运行这个脚本。

使用步骤

  1. 进入你的Logseq库
  2. 创建一个名为 Start-GitAutoCommit.ps1 的文件,并把上面这个文件的代码复制粘粘贴进去
  3. 创建一个名为 Auto-Commit.bat 的文件,并把上面这个文件的代码复制粘贴进去,并修改 ::移动到你的logseq库文件夹内 后面的 D: cd D:\developer\logseq 为你的logseq库的路径
  4. 运行 Auto-Commit.bat 即可

或者你可以直接下载这两个文件放到你的logseq库目录下面

计划任务后台自动运行

可以使用计划任务实现电脑打开即可后台自动执行该同步脚本,实现无感、快速的同步体验,配置步骤如下:

  • 进入 控制面板\所有控制面板项\Windows 工具 里找到 计划任务
  • 点击创建任务,按下面的附图1、2、3进行设置即可
  • 创建时间 2022-07-12 12:12
  • 发布时间 2022-07-13 22:07
  • 最后更新 2022-07-30 10:25