This repo includes scripts to simplify the setup of syncing Git repositories on Android devices using Termux. Termux is an Android terminal emulator and Linux environment app.
The original purpose for me was to auto-sync my Obsidian vault between devices with Git.
The idea to use Termux for automatic syncing came from Rene Schallner: Syncing your Obsidian vault to Android via an encrypted GitHub repository
For syncing I'm now using the script git-sync.sh
by Simon Thum: simonthum/git-sync
There are many ways to sync git repositories with Android devices. However, in my experience, this setup with git inside the Termux environment is the most flexible and reliable.
Alternatives:
- Obsidian community plugin Obsidian Git: Great on desktop, but the mobile version has some limitations that make it a bad choice for me.
- Android app MGit: No auto-sync in the background possible, has problems with storage permissions (see issue 620).
- Android app GitJournal: No auto-sync in the background possible.
- Syncthing: Generally a great solution for syncing! However, in my opinion you shouldn't use Syncthing to sync a Git repository. Also, I don't like having a file synced multiple times in the background while I'm editing it.
- Install Tasker, Termux, Termux Widget and Termux Tasker
- Inside Termux, install some required packages:
pkg update && pkg upgrade pkg install git openssh rsync
- Give Termux access to your storage (Termux-setup-storage):
termux-setup-storage
If you set up remote access to Termux on your Android device, the following steps will be easier.
Start OpenSSH server in Termux:
sshd
Access your Termux session from another device (change the IP address to the address of your device, e.g. use ifconfig
):
ssh -p 8022 192.168.0.108
If you want to use SSH for accessing your remote Git repositories, create a new key pair:
ssh-keygen -t ed25519 -C "your optional comment"
eval "$(ssh-agent -s)" # start the ssh-agent in the background
ssh-add ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub
Copy the public key to your Git remote server (GitHub, ...).
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
Clone this repo inside Termux:
cd ~
git clone https://github.com/davidkopp/termux-scripts.git
cd termux-scripts
Note: During the setup some changes are made to your git configuration. If you want other options, modify the script 'configure-git.sh'.
First ensure that all scripts are executable:
chmod +x *.sh
You can choose between the three different ways of setting up your repository/repositories:
- Interactive mode (
setup-interactive.sh
)- provides the possibility to clone a Git repository
- can also be used if a local Git repository already exists
- can be used for both, single-repo setup and multi-repo setup
- Single-repo setup (
setup-single-repo.sh
)- Git repository has to already exist locally
- path to this single repo is stored in a config file called
repo.conf
in your home directory
- Multi-repo setup (
setup-multi-repo.sh
)- Git repository has to already exist locally
- no central config file, path to the respective repository must be provided as an argument for each script later on (e.g.
sync.sh ~/storage/shared/git/notes
)
Single-repo setup means that you only have one Git repository that you want to sync. The path to this single repo is stored in a config file called repo.conf
in your home directory.
You can either use an interactive mode (setup-interactive.sh
) or directly provide the required parameters as arguments to the script setup-single-repo.sh
.
./setup-single-repo.sh path-to-repo branch-name
Arguments:
path-to-repo
: local path to git repo (required)branch-name
: git branch name (optional, default "main")
Example with real values:
./setup-single-repo.sh ~/storage/shared/git/notes main
Now you are done with the setup in Termux.
You can now open your launcher's widget menu, select Termux:Widget and place the widget for a script on your home screen. If you want to setup automatic sync for a repository see the section Setup automatic sync below.
Multi-repo setup means that you have multiple Git repositories that you want to sync.
The path to a single repository must be provided as an argument for each script later on (e.g. sync.sh ~/storage/shared/git/notes
).
You can either use an interactive mode (setup-interactive.sh
) or directly provide the required parameters as arguments to the script setup-multi-repo.sh
.
./setup-multi-repo.sh path-to-repo branch-name repo-name
Arguments:
path-to-repo
: local path to git repo (required)branch-name
: git branch name (optional, default "main")repo-name
: name used as a suffix for script names (optional, if not provided the name of the repo is used)
Example with real values:
./setup-multi-repo.sh ~/storage/shared/git/notes main notes
Now you are done with the setup of one repository. If you want to setup another repository, just repeat the same steps and provide a different path to the script.
You can now open your launcher's widget menu, select Termux:Widget and place the widget for a script on your home screen. If you want to setup automatic sync for a repository see the section Setup automatic sync below.
To automatically commit and sync changes I use the Termux add-on Termux:Tasker.
Tasker profile configuration (simplified):
- Trigger:
- Every 1h
- Wifi Connected
- Task "Git Sync":
- Flash with text (e.g. "Git sync")
- Termux:
- Executable:
sync.sh
- Arguments (not used anymore, was used in the past to provide a path in a multi-repo setup)
- ✔ Wait for result for commands
- Timeout: 30 seconds
- Executable:
Mathis Gauthey has also published a great tutorial with some helpful screenshots: How to Use Obsidian Git Sync on Android
As an alternative you can also setup a cronjob (see here for advice).