git-mirror/README.md
2022-05-23 14:35:29 +02:00

2.7 KiB

Git mirror

Run this script to synchronize a repository once.

Quick start

Clone git-mirror somewhere on your system. Create a script like the following in the directory of the repository you want to keep mirrored, and configure the variables:

#!/bin/sh

mirror="$HOME/path/to/git-mirror/git-mirror.sh"
leader="github" # Name of the leader remote
followers="origin" # Space separated list of names of follower remotes

exec "$mirror" --notor "$(dirname "$0")" $leader $followers

Dependencies

  • bash
  • git
  • Tor and torify (see section "Tor")

Usage

./git-mirror.sh <workdir> <leader> <follower...>

How to use

Create a git repo, add remotes for the leader and the followers:

mkdir ~/git-mirror-my-repo; cd ~/git-mirror-my-repo
git init
git remote add github https://github.com/interesting/repo
git remote add gitea ssh://git@git.example.org/me/interesting-repo
git remote add gitlab ssh://git@git.example.com/myself/interesting-repo

Make sure Tor is running (see section "Tor"). Then run the mirroring script:

cd
git clone https://git.zeus.gent/midgard/git-mirror.git; cd git-mirror
./git-mirror.sh ~/git-mirror-my-repo github gitea gitlab

The first remote, github in this case, is the leader. The others are followers that are updated.

If you want to do this conveniently every now and then, you can create a script like this in your repository's directory:

#!/bin/sh

mirror="$HOME/path/to/git-mirror/git-mirror.sh"
leader="github" # Name of the leader remote
followers="origin" # Space separated list of names of follower remotes

exec "$mirror" --notor "$(dirname "$0")" $leader $followers

Make sure to make it executable, and gitignore it when relevant. A good idea may be to choose an arcane name, like update--.sh, and add it to a global gitignore file in ~/.gitignore.

Caveat

If a branch has diverged, it will not be updated. Update it manually in that case.

Automate

To automate mirroring, run it periodically, for example once every 30 minutes. On a *NIX you could use cron for this, or write a system service definition for your system supervisor (such as systemd, OpenRC or runit).

Tor

Unless the option --notor is used, the leader is fetched over Tor through torify. Make sure Tor is running, or pass --notor to the script, like so:

./git-mirror.sh ~/git-mirror-my-repo github gitea gitlab

Motivation

GitHub has always been hypocritical, promoting open source while keeping its own stack closed. When GitHub was bought by Microsoft, the author decided to stop using it. Unfortunately a lot of software still only has a presence on GitHub. To make it easier to work with those, this simple mirror script was written.