Automatically merge syncthing conflicts

I don’t always have a perfect internet connection for multiple reasons (German trains, device is off, Wifi is disabled on the E-Reader to save power), so I used to have a lot of conflicts when using Syncthing, which I found super annoying, because often it would look like a data loss (it’s better now that conflict files are shown in Logseq itself, but still annoying) - all the stuff I had written on the train would just be gone.

So I built a little script based on Automatically resolve Syncthing conflicts using a three-way merge · Rafael Epplée that automatically detects conflicts and merges the corresponding files.
Finally no more .sync-conflict files scattered around the place! Since the sync-conflict files are just normal files that are synced, the conflict resolution can be done on one device and is synced over automatically. I have been stress testing it a little and it has held up very well.

There are a few assumptions:

  • Git is installed on the machine the script runs on
  • Versioning is enabled (I use staggered versioning)
  • The script is running inside the (base of) the Logseq folder

Now instead of sync conflicts/apparent data loss, the worst thing you’ll get is duplicated nodes.

Here it is: syncthing-automerge.py

Makes my life much easier, maybe someone else appreciates.

Sounds interesting, would you share the script?

3 Likes

While I’m using Logseq Sync on the moment, this looks like a perfect solve on my original syncthing setup, where I wasted so much time resolving stupid conflicts. (Like 2 empty files stupid)

Add it to my notes to try when another conflict draws me back to syncthing

1 Like

Oh well that’s silly. I updated the post to actually include the script (lol, thanks for pointing out it’s missing).

As for reliability: It has been running on my server since I first made it a few weeks ago and it has been working perfectly well. The relief is immense, this used to be a big issue and I’m glad that it’s gone.

Since I have Syncthing on my server in a container, I made another one for this script and stuck it into the same docker-compose setup. Works well!

2 Likes

How do you run the script in the background? Or you only run it each time you see a conflict? Thank u

It runs constantly on my server, which also functions as a syncthing node. I use a container and docker-compose because I also run syncthing that way, but you could also use a systemd unit.

As a brittle but very simple way you could go the nohup/disown route, the main disadvantage being that you have to re-run it after every restart (definitely not recommended, but I ran Minecraft servers like this for quite a while).

Here’s my Dockerfile:

FROM alpine:latest

RUN apk add python3 py3-pip git
RUN pip install watchdog

WORKDIR /data

CMD ["sh", "-c", "ls -lah / && echo hi && python3 deconflicter.py"]

The sh-dance at the bottom is probably not necessary, but I used it for debugging and haven’t tested it without it.

Then in my docker-compose.yaml I mount the directory I want to deconflict to /data in the container:

version: "3"
services:
  # syncthing: (...)

  deconflicter:
    build: logseq-deconflicter
    volumes:
      - "/path/of/logseq-files:/data/"

Theoretically you could run the script on your main computer (or phone if you’re really crazy), but then it has to be on whenever you want to resolve a conflict.

1 Like

Thank you, I’ve ran it using Automator on my Mac now

Could be possible to run this using “external file versioning” option provided by syncthing?