How do I keep an svn:external up to date using git-svn?

Solution 1:

The best means of integrating svn externals with git-svn that I've seen is this script, which clones your externals into a .git_externals/ directory and creates the symlinks and exclude files you need. I find this a simple and direct solution. YMMV.

Here is an older overview of other options for dealing with svn externals with git-svn. To me they look a little over-complicated and liable to break under subsequent Git use.

Solution 2:

The solution I ended up using was just to symlink to other git-svn clones on my local box. This worked pretty well: it allows me to commit changes back, and it allows me to make local changes on project A just to get them into project B.

Solution 3:

I just wrote a short script which checkouts all svn:externals of the current HEAD to the root directory and excludes them from the git repository.

Place it to .git/hooks/post-checkout and it will keep those external checkouts up to date whenever the working tree changes, for example due to git svn rebase or git-checkout.

#!/bin/bash
set -eu

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
    while read checkout_args
    do
        checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
        svn checkout ${checkout_args}
        if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
        then
            echo ${checkout_dirname} >> .git/info/exclude
        fi
    done
}

Solution 4:

I also made a script (both Perl and Ruby variants available) that does this for me, it's at http://github.com/liyanage/git-tools/.

  • Recursively checks out all svn:externals
  • Can be run repeatedly in case the clone of a large repository aborts halfway through. Happened to me a lot. It picks up where it left off.
  • Adds all svn:externals entries it finds and processes to .git/info/exclude
  • Adds all svn:ignore entries it encounters to .git/info/exclude
  • Can be run regularly after the first run to do the svn:rebase in all cloned sub-sandboxes, discover new externals and new svn:ignores

Update: I am no longer maintaining this script. Its functionality for recursively cloning and updating an SVN repository, as well as other git-related features, is available in this newer project that I am actively maintaining: http://liyanage.github.com/git-tools/