Subject: Re: GSOC Proposal draft: git-remote-svn

From: Andrew Sayers <[email-masked]>
Date: Sat, 14 Apr 2012 22:35:59 +0100

On a slightly different topic, here's the only branching edge case I
know of that will affect you.  I agree with Jonathan that you should
focus on the standard layout for now, but I think it's worth having the
trickier cases in your head when you're planning things out.

Imagine a team does this:

# Slight misunderstanding of the standard layout at first:

mkdir trunk/project1 trunk/project2
svn add trunk
svn ci -m "Initial revsion" # r1

# Time passes, commits are made, people get smarter.
# In revision 1000, the team decides to put the structure right:

svn rm trunk
svn ci -m "Removed incorrect directory name" # r1000

mkdir trunk
touch trunk/MOVED_TO_PROJECT_TRUNK
svn ci -m "Added signpost file for future reference" # r1001

mkdir project1 project2
svn cp -r 999 trunk/project1 project1/trunk
svn cp -r 999 trunk/project2 project2/trunk
svn ci -m "Recreated projects with correct directory names" # r1002

This would be represented in SBL something like:

In r1, create branch "trunk/project1"
In r1, create branch "trunk/project2"

# We would prefer just to deactivate these...
In r1000, deactivate "trunk/project1"
In r1000, deactivate "trunk/project2"

# ... but we have to delete them,
# because git doesn't support recursive branch names:
In r1001, delete branch "trunk/project1"
In r1001, delete branch "trunk/project2"
In r1001, create branch "trunk"

# We deleted the branches, so how do we get the commit to fork from?
In r1002, create branch "project1/trunk" from "trunk/project1" r999
In r1002, create branch "project2/trunk" from "trunk/project2" r999

If you look in your ".git/refs/heads/" directory, you'll see git
branches are stored as files on disk.  So if you have a branch
"trunk/project1", you can't create a branch called "trunk" unless you
delete the directory called "trunk" first.  This unfortunate limitation
of an otherwise neat solution means you can't reliably use git branches
when retrieving older revisions.

Other people will be able to tell you if there's any interest in
removing this limitation, but even if there is, users will occasionally
change their mind after asking for a branch to be deleted, and be
surprised if SVN lets them but git doesn't.

One solution you could look at would be storing dead branches in a JSON
file somewhere.  If you go down that route, remember that `git gc` will
try to garbage collect the commits once the branches have been dead for
long enough.

	- Andrew