svngitpost-commit

read-only git mirror of an svn repository


What would be the best way to set up a read-only git mirror of an existing svn repository, and set up post-commit hooks such that whenever someone commits to svn, the git mirror is automatically updated? Mainly, I'd like to run git-svn clone just once, on the server, and then let people just check out from git without having to git-svn clone the entire svn repository themselves.


Solution

  • I do that on a project that uses SVN (pushing to a public repository on github). I don't have a SVN commit hook, but this on a cron job:

    #!/bin/bash
    
    repo=/path/to/my-mirror.git
    lockfile="$repo/cron-lock"
    
    if ! lockfile -r1 "$lockfile";then
            exit 1
    fi
    
    export GIT_DIR=$repo
    # update refs/remotes/git-svn:
    git svn fetch -q
    # make 'master' match the git-svn branch:
    git fetch "$repo" refs/remotes/git-svn:refs/heads/master
    # publish to github
    git push github master
    
    rm -f "$lockfile"
    

    If you trigger this from a SVN commit hook instead of a cron job, it should work.

    Of course, you need to set up a remote called github using git remote add github [...]. The git repository I am using is a "bare" repository (see git init --bare).