2010-01-20 8 views
7

Ich möchte ein Repository von Subversion zu Mercurial konvertieren, aber als ich das Repository ursprünglich eingerichtet habe, habe ich es auf die faulste Art und Weise gemacht. Mit der Zeit entwickelte sich die Struktur weiter und verschlechterte sich (sie ist zu diesem Zeitpunkt 5 Jahre alt). Nichtsdestotrotz möchte ich so viel Geschichte wie möglich bewahren, selbst wenn ich mich schmutzig machen und die Dinge wieder zusammennähen muss.Wie kann man von Subversion nach Mercurial migrieren, wenn die Struktur trunk/branch/tag unordentlich ist?

Ohne weitere Umschweife, sieht die aktuelle Struktur wie folgt:

svn://svn.example.com/Example 
    + trunk 
     + BigProject 
     + BinaryDepedencies 
    + branches 
     + BigProject 
      + branch1 
      + feature1 
      + maintenance1 
      + ... 
    + tags 
     + BigProject 
      + tag1 
      + tag2 
      + ... 
    + projects 
     + small_project1 
     + small_project2 
     + small_project3 
     + ... 

Da dies nur die jüngste Struktur gibt es für dieses Repository keine Hoffnung? Wenn es keine Hoffnung gibt, hat jeder einen guten Ansatz, die Geschichte in Mercurial (oder Basar) von Hand zu rekonstruieren.

Auch aus verschiedenen Gründen kann ich Git nicht verwenden, es sei denn, es gibt eine kugelsichere Strategie, um diesen spezifischen Repo von Subversion in git in hg/bzr umzuwandeln.

+0

Es wird bald eine neue gute Antwort geben. Reposurgeon erweitert die Fähigkeit, Subversion zu importieren, und es sieht so aus, als würde man dieser Fähigkeit viel Aufmerksamkeit widmen: http://esr.ibiblio.org/?p=4071 – Omnifarious

Antwort

7

Eine Strategie könnte sein, den Stamm zu konvertieren. Sie müssen möglicherweise einige Spiele spielen, wenn Ihr Stamm sich bewegt hat, aber es sollte nicht zu schwer sein.

Ein weiteres Werkzeug in Ihrem Arsenal könnte hg-> hg Umwandlung und die Erweiterung der Erweiterung sein. Sie können diese verwenden, um mit Ihrem Baum herumzuspielen, nachdem Sie Dinge in einem hg-Repository haben, und nach dem Konvertieren in Zweige verzweigen. Oder pfropfen Sie neue Stücke Ihrer Stammgeschichte ein, nachdem sie umgezogen sind.

Hier ist ein schöner Link zur Dokumentation über die Mercurial rebase extension.

Im Grunde ist hier die Strategie, die Sie folgen würden ... Verwenden Sie zuerst die convert extension oder hgsvn, um Teile des Repository zu konvertieren. Dies kann zu mehreren Stammzeilen oder zu Zweigen führen, die sich in einem separaten Repository von der Hauptlinie befinden.

Wenn Sie zwei Abschnitte von Stamm haben in getrennten Repositories und mit dem im Verzeichnis mit dem Namen folgt second direkt mit dem im Verzeichnis mit dem Namen first, können Sie dies tun:

cd second 
hg log -r 0 
# Note the revision hash 
cd ../first 
hg tip 
# Again, note the revision hash 
hg pull -f ../second 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash from hg tip> 

Das einen Abschnitt von Graft Stamm auf einen anderen Abschnitt des Stammes.

Wenn Sie eine Niederlassung in einem separaten Repository haben, ist das Verfahren etwas kniffliger:

cd branch 
hg log -r 0 
# Note the revision hash 
cd ../trunk 
# Find the revision that the branch branches off from and note its hash. 
# We will call this revision the 'branch base'. 
hg pull -f ../branch 
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash of branch base> 

, dass der Zweig auf den Hauptbaum pfropfen wird.

+0

Kannst du erklären, wie man auf Ästen transplantiert? Die Idee von hg-> hg klingt vielversprechend. – user255063

+0

@Throttled - Dort machte ich eher einen Erklärungsversuch. :-) – Omnifarious

+0

Super, danke. Das gibt mir ein bisschen zu kauen. – user255063

3

Nach der convert extension's docs sollte etwas wie das Folgende funktionieren.

$ cat > ~/.hgrc <<EOF 
[extensions] 
hgext.convert= 
EOF 
$ hg convert --config convert.svn.trunk trunk/BigProject --config convert.svn.branches branches/BigProject --config convert.svn.tags tags/BigProject svn://svn.example.com/Example newhgrepo 
+1

Sehr schöner Vorschlag, es scheint, als könnte ich versuchen, die gleiche Strategie zu verwenden, um die kleinen Projekte in ihr eigenes Repo zu zerlegen. – user255063