git svn - clone repo with all externals
Asked Answered
P

3

13

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.

Priceless answered 17/7, 2012 at 10:28 Comment(1)
there is github.com/andrep/git-svn-clone-externalsBiathlon
S
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.

Shimmy answered 17/7, 2012 at 10:38 Comment(4)
The followup question: Does SmartGit support git-svn?Limassol
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.Shimmy
SmartGit only creates a .gitsvnextmodules and after calling "git submodule update --init --recursive" nothing happens. So I assume there is something not working correct...Decennium
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')."Decennium
A
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.

Anesthetize answered 24/1, 2013 at 0:33 Comment(4)
I found the above technique very useful - except I had to reverse $2 and $1 (the local dir and the remote)Presentational
@Presentational 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.Anesthetize
Perhaps the clone syntax changed between version? Today it's clone $url [$target_dir] (dir is optional)Presentational
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.Legendre
P
2

I post solution here that works in my case

git svn show-externals | \
  awk '/^\// { print "git svn clone "$3" ."$1" "$2":HEAD"  }' | \
  bash
Pamphylia answered 29/8, 2014 at 13:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.