原文: http://1900.live/logseq-auto-commit-sync/
我目前正在使用的就是 Git 方案,该如何创建库之类的操作我就不再说了,社群和网上有很多资料,我这里单独说下我是怎么让 Git 实现多端(多个 window 间同步)同步,同时解决多端无脑同步的问题
目前 Github 上有两三个专门针对 Logseq 写的自动 Commit 工具,分别是
Logseq 官方的同步脚本:https://github.com/logseq/git-auto
热心网友写的: https://github.com/CharlesChiuGit/Logseq-Git-Sync-101
热心网友写的那个我之前一直出现各种莫名奇妙的问题导致无法提交,所以现在用的是第一个 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 脚本就能实现开机自动后台运行这个脚本。
进入你的 Logseq 库
创建一个名为 Start-GitAutoCommit.ps1
的文件,并把上面这个文件的代码复制粘粘贴进去
创建一个名为 Auto-Commit.bat
的文件,并把上面这个文件的代码复制粘贴进去,并修改 ::移动到你的 logseq 库文件夹内
后面的 D:
cd D:\developer\logseq
为你的 logseq 库的路径
运行 Auto-Commit.bat
即可
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.