All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Douma <n.douma@nekoconeko.nl>
To: Andrew Sayers <andrew-git@pileofstuff.org>
Cc: git@vger.kernel.org
Subject: Re: Migrating SVN to Git, and preserve merge information
Date: Wed, 11 Apr 2012 09:24:35 +0200	[thread overview]
Message-ID: <4F8531B3.9030501@nekoconeko.nl> (raw)
In-Reply-To: <4F84BAE2.5090803@pileofstuff.org>

[-- Attachment #1: Type: text/plain, Size: 2361 bytes --]

Hi Andrew,

On 11-04-12 00:57, Andrew Sayers wrote:
> Would I be right in thinking that a commit like "Merged r100,r101,r102
> from trunk" will create three grafts?  If so, that might be the problem.

One SVN 'merge' commit will generate one graft. The graft itself will
contain all revisions mentioned in the merge commit, and whatever the
original git parent was before the graft.

> Git differentiates between "merges" (which include every commit up to
> and including the specified one) and "cherry-picks" (which just include
> the specified commit), whereas SVN calls both of these "merges".  Grafts
> are a way of creating "merges" rather than "cherry-picks" (which git
> doesn't have any metadata for), and it's not at all easy to get "merge"
> data out of SVN in the general case.  Having said that, it's often a
> good enough heuristic to pick the highest revision number mentioned in
> the commit message and pretend it's a merge.

The way we 'merged' in SVN was indeed more like cherry-picking, but I'm
looking to display this information as a merge in Git. I also would like
to include all revisions if possible.

The real problem I seem to be having is not completely understanding how
Git grafts work, because I think I'm hitting some kind of limitation or
bug, or just not using it right.

> Incidentally, I'm planning to work on this area of SVN->git conversion
> in the coming months.  I don't have anything you could use yet, but I
> don't suppose the scripts you used are available somewhere?  Getting
> revision information out of log files is particularly tricky, and
> everyone stumbles over a different set of issues.  I'd be really
> interested to pick any nuggets of wisdom out of the approach you took.

I don't really have any useful script for you at the moment, but the
main approach is this:

* I first tag all SVN Git commits with the original SVN revision, like:
"svn/1234"
* Then I retrieve all commits with "merge" in the message, but not "unmerge"
* Now I filter all revisions from the commit message using a regex or two.
* Using all relevant revisions, I retrieve the corresponding SHA hashes
using the tag names I created in step 1.
* Finally, I write a graft file in format:
<merge commit> <original git parent> <merge rev 1> ... <merge rev n>

Kind regards,

Nick Douma


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]

  reply	other threads:[~2012-04-11  7:24 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-10 15:18 Migrating SVN to Git, and preserve merge information Nick Douma
2012-04-10 22:57 ` Andrew Sayers
2012-04-11  7:24   ` Nick Douma [this message]
2012-04-11 11:13     ` Santi Béjar
2012-04-11 17:58     ` Andrew Sayers

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=4F8531B3.9030501@nekoconeko.nl \
    --to=n.douma@nekoconeko.nl \
    --cc=andrew-git@pileofstuff.org \
    --cc=git@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.