From: Steven Grimm <koreth@midwinter.com>
To: Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: git-svn and local only topic branch
Date: Wed, 02 May 2007 12:06:15 -0700 [thread overview]
Message-ID: <4638E127.4010303@midwinter.com> (raw)
In-Reply-To: <8b65902a0705010940pb3bfb16u624d470068351624@mail.gmail.com>
Guilhem Bonnefille wrote:
> I want the following result:
>
> o--o--o-------------- o (upstream, remotes/upstream)
> \ /
> o--o--o--o (topic)
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
next prev parent reply other threads:[~2007-05-02 19:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-01 16:40 git-svn and local only topic branch Guilhem Bonnefille
2007-05-01 16:45 ` Adam Roben
2007-05-01 17:30 ` Guilhem Bonnefille
2007-05-01 18:29 ` Andy Parkins
2007-05-02 19:06 ` Steven Grimm [this message]
2007-05-03 11:24 ` Guilhem Bonnefille
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4638E127.4010303@midwinter.com \
--to=koreth@midwinter.com \
--cc=git@vger.kernel.org \
--cc=guilhem.bonnefille@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).