Using Git to sync CherryTree notes between systems
As much as I love posting information and stories to this site for others to consume there are other things I don't want put out on the web like my personal journal. Not like there is anything “bad” in there its just boring stuff I don't think most people would be interested in. I like to keep these notes in CherryTree. As it says in the official repo “A hierarchical note taking application, featuring rich text and syntax highlighting, storing data in either a single file (xml or sqlite) or multiple files and directories.”
I have used the application on Windows for keeping track of my projects at work and other one offs. I was really bad about just keeping things in notepad and after a while looked for alternatives. Spent a little bit of time with notepad++ but ended up pretty happy with CherryTree and I have used it ever since.
The one feature CherryTree is missing is the ability to sync between different host. I am not trying to sync things between teams of people or anything I just want to sync my own notes between my own devices. Well it looks like this is another job for my personal git repos.
Alright I explained enough about the git repo setup on the host your own git page, in the case of CherryTree I am not going to use the repos directory. I had already started saving CherryTree notes to a folder under my home documents called “CherryTree_Docs”. When saving files in CherryTree they aren't saved as raw text files you can save them in a SQLite file or in XML format.
I saved my documents as SQLite before I started this whole process. These files are in binary database type format which so far is working when I push/pull from the git repo, but If I had to do it again I may go with XML format for the git merging possibilities. I am going to stick with the SQLite for now and will update this if I ever decide to change.
Step 1: Initialize the repository from the directory you save CherryTree files in
nugget@tiptop:~$ cd ~/Documents/CherryTree_Docs/
nugget@tiptop:~/Documents/CherryTree_Docs/ git init
nugget@tiptop:~/Documents/CherryTree_Docs/ git status
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
Erics_Journal.ctb
Erics_Journal.ctb~
Erics_Journal.ctb~~
Erics_Journal.ctb~~~
Kaiser_IT_Personal.ctb
Kaiser_IT_Personal.ctb~
Kaiser_IT_Personal.ctb~~
Kaiser_IT_Personal.ctb~~~
Kaiser_IT_Planning.ctb
Kaiser_IT_Planning.ctb~
Kaiser_IT_Planning.ctb~~
Kaiser_IT_Planning.ctb~~~
nothing added to commit but untracked files present (use "git add" to track)
nugget@tiptop:~/Documents/CherryTree_Docs$ git add -A
nugget@tiptop:~/Documents/CherryTree_Docs$ git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: Erics_Journal.ctb
new file: Erics_Journal.ctb~
new file: Erics_Journal.ctb~~
new file: Erics_Journal.ctb~~~
new file: Kaiser_IT_Personal.ctb
new file: Kaiser_IT_Personal.ctb~
new file: Kaiser_IT_Personal.ctb~~
new file: Kaiser_IT_Personal.ctb~~~
new file: Kaiser_IT_Planning.ctb
new file: Kaiser_IT_Planning.ctb~
new file: Kaiser_IT_Planning.ctb~~
new file: Kaiser_IT_Planning.ctb~~~
nugget@tiptop:~/Documents/CherryTree_Docs$ git commit -m "Initialize repository"
[main (root-commit) 1c6be2f] Initialize repository
12 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Erics_Journal.ctb
create mode 100644 Erics_Journal.ctb~
create mode 100644 Erics_Journal.ctb~~
create mode 100644 Erics_Journal.ctb~~~
create mode 100644 Kaiser_IT_Personal.ctb
create mode 100644 Kaiser_IT_Personal.ctb~
create mode 100644 Kaiser_IT_Personal.ctb~~
create mode 100644 Kaiser_IT_Personal.ctb~~~
create mode 100644 Kaiser_IT_Planning.ctb
create mode 100644 Kaiser_IT_Planning.ctb~
create mode 100644 Kaiser_IT_Planning.ctb~~
create mode 100644 Kaiser_IT_Planning.ctb~~~
nugget@tiptop:~/Documents/CherryTree_Docs$
As you may notice CherryTree has some of its own versioning/roll back methods. I believe this is done by naming files with the ctb extension then adding the tilde ~, ~~, ~~~ I haven't had to dig that far into it yet but I this seems to be the logic from some of my brief reading.
Step 2: Building a bare repo on your git server
SSH to your remote host and setup the bare repo: (this is assuming you have the right accounts and sshkeys setup)
nugget@tiptop:~$ ssh nugget@gitshed.igazine.com
Last login: Tue May 27 15:18:33 2025 from 127.0.0.1
nugget@gitshed:~$ mkdir -p git/cherrytree.git
nugget@gitshed:~$ git init --bare git/cherrytree.git
Step 3: Pushing to the git server Now return back to the host with the ChreeyTree .ctb files and sync these files to the remote repo.
nugget@tiptop:~/Documents/CherryTree_Docs$ git remote add origin nugget@gitshed.igazine.com:/home/nugget/git/cherrytree.git
nugget@tiptop:~/Documents/CherryTree_Docs$ git branch -M main
nugget@tiptop:~/Documents/CherryTree_Docs$ git push -u origin main
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 16 threads
Compressing objects: 100% (20/20), done.
Writing objects: 100% (20/20), 158.20 KiB | 17.58 MiB/s, done.
Total 20 (delta 16), reused 0 (delta 0), pack-reused 0
To gitshed.igazine.com:/home/nugget/git/cherrytree.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
And this is my first edit after pulling the DB down to my laptop… Holy Hell it works! I just need to remember to git push from my laptop to the remote server and sync on my workstation before editing again.
I am saving these files as SQLite but I am now thinking I could do XML instead, the git merge possiblites are attractive but need to test.