Subject: Re: git svn: Supporting multiple branch subdirs?

From: Michael J Gruber <[email-masked]>
Date: Wed, 17 Jun 2009 16:25:50 +0200

Marc Branchaud venit, vidit, dixit 15.06.2009 19:29:
> Michael J Gruber wrote:
>>
>> After doing the init with "--branches=stable" (without releng), do
>> git config --add svn-remote.svn.branches 'releng/*:refs/remotes/*'
>>
>> This gives you two branches refspecs in .git/config (feel free to put
>> them in different dirs under remotes if there may be name clashes
>> between stable and releng branches).
> 
> That doesn't seem to work...

No, it doesn't I'm sorry. I knew that git-svn lumps multiple command
line arguments into one, but it does so also for config lines. I didn't
know that but confirmed from a test (and the source).

Now, one last resort would be a more complicated regexp. Unfortunately,
something like

branches = (releng|stable)/*:refs/remotes/*/*

does not work (regexps don't work, only globs)

and something like

branches = */*:refs/remotes/*/*

works in principle but gets everything under head wrong.

> 
> Here's my .git/config file before the first fetch:
> 
> [svn-remote "svn"]
>         useSvnsyncProps = 1
>         ignore-paths = ^[^/]+/(?:cvs2svn|projects|svnadmin|user|vendor.*)
>         url = file:///home/marcnarc/Code/FreeBSD-all-mirror/base
>         fetch = head:refs/remotes/trunk
>         branches = stable/*:refs/remotes/stable/*
>         branches = releng/*:refs/remotes/releng/*
>         tags = release/*:refs/remotes/tags/*
> 
> (Shouldn't that fetch line be head:refs/remots/head, since there's nothing called "trunk" in the svn repo?  I used git-svn init --trunk=head ...)

The left hand side of the refspec refers to the svn repo, the right hand
side only names your local ref. Feel free to put "head" there, although
this can be confused very easily with "HEAD" which has special meaning
in git.

>> I assume that git-svn converts such an svn commit into several git
>> commits, one for each affected branch. Since you have a local mirror
>> it's easy to try out.
> 
> Yep, git-svn does just that.  Nice!
> 
> 		M.

At least I got one thing right :)

I've used multiple svn-remote sections before (in cases where the repo
structure changed) but I'm afraid this is of no use here. Looking at the
source of git-svn, one sees that "tags" and "branches" are basically
treated the same way, they are simply members of a "remote"
struct/object/whatever it's called in perl and only differ in their
standard refspec. Noone keeps us from adding "branches2" for a quick
hack and checking whether everything stays sane... (git-svn perl often
loops over "branches tags", that needs to be replaced).

In fact, I think the way to go would be replacing the two by an array.
As a next step, the command line parsing and config reading needs to be
changed so that multiple branches or tags entries end up generating
multiple members of that array. Now this only needs to be implemented ;)

Michael

P.S.: Let me know if you give it a shot, so that we don't duplicate our
waste of time...