Backup multiple git bare resoritories with git clone --mirror
git clone --mirror
For almost evertything I do, I make use of a version control system. I started out with CVS many years ago. Later I migrated my entire collection of CVS repositories to Git.
Now I have a great number of bare repositories on my git-server and used rsync to make a backup of these repositories.
Git offers the --mirror option to make perfect backups. so I wrote a little scripts to use that option to keep a backup.
This is what this script looks like:
#!/bin/sh backupdir=/path/to/backup/mirrors cd $backupdir for file in `ssh email@example.com ls` do echo $file if [ -d "$file.git" ]; then cd $backupdir/$file.git; git remote update; cd $backupdir/ else git clone --mirror firstname.lastname@example.org:$file fi done
This script runs on the system where the backup lives.
- backupdir : this is the directory where the backups will be pushed
- email@example.com : this is the user and the server where the original bare repositories are
The scripts first asks a list of all available repositories on my local git server, the server where the original bare repositories are. This is done with the line
for file in `ssh firstname.lastname@example.org ls`
Then it iterates over this list and for each resporitory checks if a directory for this already exits. If so, it does a git remote update, of not it creates a new mirror with clone --mirror.
ssh key and authorized_keys
In order to let the backup scripts do its work unattended, set up ssh-keys so the script kan reach the local git server without the need for passwords.
Put the .pub part of the key from the user on the backupserver in the authorized_keys file on the local git server. Check to see if you can login without the need to enter a password.
Testing the script
Create the backupdir the backup-server and run the script. This will create a number of directories, each with a mirror of the git repository in case.
Clone a repository from the local git server, make some changes and push those back to the local git server.
Run the backup-script again and check that there is actual some output on this particular repository (lines like "remote: Counting objects: 4, done." et cetera).
Testing the backup
A backup that is not tested is not a backup!
You should test your backups regular, so you know for sure you can count on them when needed.
So do a git clone from the backupserver (and not from the local git server) to see if the backup really works.
Run the script from cron
Now the final step is to let cron do nightly backups
Setup a line for this with crontab -e, perhaps something like this:
12 2 * * * /path/to/the/backup-script >/dev/null 2>&1
This will run the script every night at 2:12.
Next morning, check to see if your scripts has worked.