Git as a Backup Solution
========================
:author: Aaron Ball
:email: nullspoon@iohq.net



To preface this post, I would like to point out two very key things. The backup
files will be stored in two branches inside of a single repository. Those
branches will be called "files" and "database". You may choose to use other
names (such as database and master) but for the purposes of this post, the
afforementioned names will be used.

If it suits you better, you could also use two git repositories. I used that
for a while and it worked great. I just found it more convenient to have the
database dumps and the wiki files in one repository for simplicity.

[[files-checkin]]
Files Checkin
-------------

This will catch all upgrades, uploads, settings file changes, etc.
Anything you change on the actual filesystem where your wiki is stored
will be commited to the repository.

----
export repo = 127.0.0.1
# Check in the files
cd /path/to/your/wiki

# Add all new, edited, and deleted files
git add . -A
# Commit our changes
git commit -m "Routine Checkin"
# Push the commit to the files branch of our repository
git push origin files
----


[[database-checkin]]
Database Checkin
----------------

For this we are going to take a database dump and overwrite the old one
with it. We will then check in the same file, but with the changes.
Again, any changes made to pages, users, logs, etc will be in the dump
file and thus will be commited to the repository.

----
dbFileName = "wiki.data.sql"
$password = "CheckMeYo"
$dumpPath = /path/to/dump/backups/
mysqldump -u wikiUser -p$pass 'databaseName' > $dumpPath$dbFileName
cd $dumpPath
git add . -A
git commit -m "Routine Checkin"
# Push the commit to the database branch of our repository
git push origin database
----


[[restoring-from-backups]]
Restoring from Backups
----------------------

Restoring from a backup is actually quite simple. All one needs to do is
fetch the repository (origin).

* Firstly, pull the database branch and run a mysqlimport on the dump
  file.
* Secondly, to get the files (and overwrite any current files), do a

----
git pull --rebase origin files
----

and the most recent version of the files branch will show up in the current
directory.

Also, if you worry someone will download your .git directory contents, you can
just move the .git directory out when you aren't doing backups and back in
temporarily for a backup.


[[size-concerns]]
Size Concerns
-------------

Git has the capability to compress repositories using the *git gc* command.
This will have git go back through all of the commits in the working repository
and compress them in the context of all of the other commits. Currently my wiki
plaintext database dump is 50 megabytes. It has been checked in to the
repository 18 times and the entire repository is about 17.5 megabytes after a
"git gc". Neat, huh?


Category:Git
Category:Backups


// vim: set syntax=asciidoc:
