I use the –mirror option and push to a personal backup repository:
Add it as a remote:
git remote add bak server:/path/to/backup/repo
Do the backup:
git push --mirror bak
This will automatically make your backup repository look like your active one — branches will be created, deleted, updated (even forced/non-fastforwards) as needed. You can make an alias for this too:
git config alias.bak "push --mirror bak"
Then, it’s just a matter of running “git bak” when you want to do a backup. You could also throw this into a cron job.