login
Header Space

 
 

Re: git-svn and local only topic branch

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Guilhem Bonnefille <guilhem.bonnefille@...>
Cc: <git@...>
Date: Wednesday, May 2, 2007 - 3:06 pm

Guilhem Bonnefille wrote:

I did something similar recently:

http://www.spinics.net/lists/git/msg29119.html

The secret is to do a squash merge (git merge --squash) and commit that 
as a single revision onto the branch you commit into svn.

1--2--3------------4 (upstream)
       \
        A--B--C--D   (topic)

As far as git's history is concerned, at this point you have a topic 
branch with a bunch of commits ABCD, and an upstream branch with a bunch 
of commits 1234. Revision 4 has the contents of ABCD but is not marked 
as a merge in git's revision history, which means git-svn won't be 
confused since it doesn't know how to follow merges.

Now you do git svn dcommit to commit revision 4, which shows up as one 
commit on the svn side. git-svn will delete your revision 4 and create a 
new one whose comment includes the svn revision ID, so you'll have:

1--2--3------------4' (upstream)
       \
        A--B--C--D    (topic)

Since git-svn will never look earlier than revision 4' to figure out 
which svn revision it should use as a basis for future svn commits, you 
can do whatever you want with the history up to revision 4'. In 
particular, you can use git's "grafts" feature to fake git into thinking 
that a merge actually took place.

Open .git/info/grafts in your favorite editor and add a line with three 
SHA-1 hashes:

hash-of-4' hash-of-3 hash-of-D

Now as far as git is concerned you have the history you want:

1--2--3------------4' (upstream)
       \          /
        A--B--C--D    (topic)

Subsequent merges on the git side, whether they're squashed or not, will 
know about the merge you've just done.

In his reply to my script, Junio correctly pointed out that all this 
fiddling really ought to be happening in git-svn itself; it ought to 
know that you've done a merge and should record that fact directly in 
the metadata for 4' rather than treating it as a single-parent commit. 
If you do the above a zillion times you'll end up with a huge grafts 
file which is not so clean. But as a stopgap measure, this does work 
adequately.

-Steve
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
git-svn and local only topic branch, Guilhem Bonnefille, (Tue May 1, 12:40 pm)
Re: git-svn and local only topic branch, Steven Grimm, (Wed May 2, 3:06 pm)
Re: git-svn and local only topic branch, Guilhem Bonnefille, (Thu May 3, 7:24 am)
Re: git-svn and local only topic branch, Andy Parkins, (Tue May 1, 2:29 pm)
Re: git-svn and local only topic branch, Adam Roben, (Tue May 1, 12:45 pm)
Re: git-svn and local only topic branch, Guilhem Bonnefille, (Tue May 1, 1:30 pm)
speck-geostationary