In a nutshell
# Inital setup git clone --mirror git://gitorious.org/weasyprint/weasyprint.git weasyprint GIT_DIR=weasyprint git remote add github [email protected]:SimonSapin/WeasyPrint.git # In cron cd /path/to/project && git fetch -q && git push -q --mirror github
How it works
Mirroring with Git is pretty easy: just pull from or push to another repository. GitHub and Gitorious allow you to push to them or pull from them, but you can not make them push to somewhere else. You need something in the middle.
Digging a bit in the man pages tells you that the magic option is
--mirror. First, clone your “source” repository:
git clone --mirror git://gitorious.org/weasyprint/weasyprint.git weasyprint
--bare. This repository is not for working, you don’t want it to have a working directory. More importantly,
--mirror sets up the origin remote so that git fetch will directly fetch into local branches without doing any merge. It will force the update if the remote history has diverged from the local one.
git remote add github [email protected]:SimonSapin/WeasyPrint.git git push --mirror github
--mirror option for git push is similar to that for git clone: instead of pushing just a branch, it says that all references (branches, tags, …) should be the same on the remote end as they are here, even if it means forced updates or removing.
Now our GitHub repository also is a mirror. Let’s update it every hour with cron. The
-q option says to suppress normal output but keep error messages, which cron should send you by email if your server is properly configured.
42 * * * * cd /path/to/weasyprint && git fetch -q && git push -q --mirror github
--mirror is like
--mirror options are kind of like
--force in that you can lose data if you’re not careful. It will make exact mirrors, no question asked. If you push changes to the mirror’s destination, they will be overwritten/removed on the next update if they are not in the mirror’s source.
Original article by Simon Sapin: http://exyr.org/2011/git-mirrors/