git/list[1] front-page[2] threads[3] people[4] search[5] about
 

git svn clone, a non-standard layout question

From
CMChristopher Marshall <christopherlmarshall@gmail.com>
Date
Aug 13, 2012, 03:23 UTC
Message-ID
<CANW+GuQ=egge=NcdSakChYXXZkW=MsG9f3i9yNvoutXXVFcPzQ@mail.gmail.com>
I would like to use git svn to clone an svn repo with a non-standard
branches layout roughly like this:
trunk/
tags/
branches/
   b1
   b2
   ...
   bdir/
      b3
      b4
      ...

That is, every directory under branches is a branch except bdir, and every directory under bdir is a branch.

One thing I have attempted is this:
   git svn clone \
                      --trunk=trunk \
                      --branches=branches/bdir \
                      --branches=branches \
                      --tags=tags \
                      --prefix=svn/ $SVN_REPO \
                      git.svn

That properly creates the remote tracking branches b1,b2,b3,b4 but also creates the remote tracking branch bdir, which I am trying to exclude. If I were to settle for this, the bdir branch would have enormous trees committed to it (when I ran against the real svn repo I am targetting).

I get can exactly the branch mapping I want by editing .git/config like this:
[svn-remote "svn"]
        url = file:///home/chris/programs/svn/repo
        fetch = trunk:refs/remotes/svn/trunk
        tags = tags/*:refs/remotes/svn/tags/*
        branches = branches/{b1,b2}:refs/remotes/svn/*
        branches = branches/bdir/{b3,b4}:refs/remotes/svn/*

but then I would have to manually add branches before every git svn fetch, or risk not importing new branches that other developers have created since I last fetched.

Chris Marshall

p.s. Here is the bash script I am using to experiment with this type of svn layout. It creates a svn repo with the structure described above, then applies my second (non-wildcard) solution. The "bash" line right before the cleanup lines at the end is to allow you to look around before everything disappears.

#!/bin/bash # file_summary: svn non-standard layout. this works, and excludes bdir, but by not using wild cards it requires that branches be added manually before a fetch.

export SVN_EDITOR=vi CWD=$(pwd) export URL=file://$(pwd)/repo

svnadmin create repo

# create top level directories. svn checkout $URL proj cd proj svn mkdir branches tags trunk svn commit -m "created top level dirs" svn mkdir branches/bdir svn commit -m "created non-standard branches dir" cd $CWD

# trunk svn checkout ${URL}/trunk proj-t cd proj-t echo -e "1\n2\n3" > f1 svn add f1 svn commit -m "added f1: 1,2,3" cd $CWD

# create branches b1,b2,b3,b4 svn copy ${URL}/trunk ${URL}/branches/b1 -m "created branch b1" svn copy ${URL}/trunk ${URL}/branches/b2 -m "created branch b2" svn copy ${URL}/trunk ${URL}/branches/bdir/b3 -m "created branch b3" svn copy ${URL}/trunk ${URL}/branches/bdir/b4 -m "created branch b4" cd $CWD

# create a b1 commit svn checkout ${URL}/branches/b1 proj-b1 cd proj-b1 echo -e "b1" >> f1; svn commit -m "b1 line" cd $CWD

# create a b2 commit svn checkout ${URL}/branches/b2 proj-b2 cd proj-b2 echo -e "b2" >> f1; svn commit -m "b2 line" cd $CWD

# create a b3 commit svn checkout ${URL}/branches/bdir/b3 proj-b3 cd proj-b3 echo -e "b3" >> f1; svn commit -m "b3 line" cd $CWD

# create a b4 commit svn checkout ${URL}/branches/bdir/b4 proj-b4 cd proj-b4 echo -e "b4" >> f1; svn commit -m "b4 line" cd $CWD

git svn clone --trunk=trunk --branches=branches --tags=tags --prefix=svn/ $URL -r 1:1 git.svn cd git.svn grep -v branches .git/config > .git/config2 mv .git/config2 .git/config echo "branches = branches/{b1,b2}:refs/remotes/svn/*" >> .git/config echo "branches = branches/bdir/{b3,b4}:refs/remotes/svn/*" >> .git/config rm .git/svn/.metadata git svn fetch

bash cd $CWD rm -rf repo proj proj-{t,b{1,2,3,4}} git.svn

Next: Peter Baumann
Message 1 of 5 in “git svn clone, a non-standard layout question”
  1. Christopher MarshallAug 13, 2012
  2. Peter BaumannAug 13, 2012
  3. Christopher MarshallAug 13, 2012
  4. Peter BaumannAug 13, 2012
  5. Christopher MarshallAug 13, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.