15

I want to use git to clone a svn repository, but unfortunately, where svn checkout gets the repo with all externals, git svn clone only gets the repository without externals. How can I get the externals from the svn repository via git svn? I don't want to do any fancy stuff, just get the the complet repo with externals.

1

3 Answers 3

10

git-svn doesn't support externals, but you may try SmartGit instead of git-svn. It supports svn:externals, converting them into .gitsvnextmodules file and displaying as modules. The only restriction: you should clone the repository with SmartGit instead of opening already existing git-svn repository.

Sign up to request clarification or add additional context in comments.

4 Comments

The followup question: Does SmartGit support git-svn?
Partially. It has compatibility and incompatibility modes. In the first one it fully emulates git-svn (hence doesn't support externals) in the second one it supports externals but not git-svn (i.e. git-svn commands will fail, you'll have to use UI to work with the repository). So you should choose.
SmartGit only creates a .gitsvnextmodules and after calling "git submodule update --init --recursive" nothing happens. So I assume there is something not working correct...
It is written in the doc (wvvw.syntevo.com/doc/display/SG/SVN+Integration) that "Only externals pointing to directories are supported, not externals pointing to individual files ('file externals')."
2

I have been use git as a front end to access a SVN repository. The structure in SVN is generally pretty simple such that there is top level directory which has the externals in it and no externals in sub-directories. Also the externals don't really change much once they are added in. So assuming something like:

git svn clone X
cd X

I have had success getting all the externals with the following command:

git svn show-externals | \
 perl -ne 'if (/^\/(.*) (.*)/) { print "git svn clone $1 $2\n"; }' | \
 bash

I guess a more complicated structure for externals would require a more complicated perl script. Also, if your externals change you will need to do something similar again.

4 Comments

I found the above technique very useful - except I had to reverse $2 and $1 (the local dir and the remote)
@tutuDajuju glad to hear it helped. Thanks for commenting. I have noticed that too but I haven't spent the time to investigate why the ordering changes in some cases.
Perhaps the clone syntax changed between version? Today it's clone $url [$target_dir] (dir is optional)
This doesn't seem to work if the external is a relative URL. ^/OS/blah/blah shows up as /trunk/^/OS/blah/blah with git svn show-externals. Furthermore, git svn clone doesn't work on either /trunk/^/OS/blah/blah or ^/OS/blah/blah. However, I can of course clone the external using the full path.
2

I post solution here that works in my case

git svn show-externals | \
  awk '/^\// { print "git svn clone "$3" ."$1" "$2":HEAD"  }' | \
  bash

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.