2012-10-17 3 views
14

Ich versuche svn2git zu verwenden, um ein SVN-Projekt zu git zu migrieren. Jedoch habe ich Probleme, die ganze Geschichte zu bewahren. Die Gründe scheinen darin zu liegen, dass der Kofferraum in der Vergangenheit bewegt wurde. Der Befehl ich verwende ist:Wie behalte ich den SVN-Verlauf in Git, wenn der Stamm verschoben wurde?

$ svn2git http://mysvnserver.com/myproject/iPhone/ --no-minimize-url --authors ../authors.txt 

Aber das gibt mir nur die Geschichte bis 2011 zurück Das Projekt beginnt eigentlich im Jahr 2010 durch die aussehen wie diese beginnt projiziertes:

myproject 
    trunk 
    branches 
    tags 

Aber im Jahr 2011 es wurde zu diesem geändert:

myproject 
    iPhone 
    trunk 
    branches 
    tags 
    Android 
     trunk 
     branches 
     tags 

Der alte Stamm und die Zweige gingen unter das iPhone-Verzeichnis. Die Geschichte, die ich bekomme, beginnt damit, wenn dieser Zug gemacht wurde. Wenn ich svn log im iPhone-Verzeichnis mache, bekomme ich die verkürzte Geschichte. Aber wenn ich cd trunk; svn log dann bekomme ich die vollständige Geschichte.

Ich habe keine Ahnung, wie man diese Geschichte herausbekommt. Meine Idee war, irgendwie ein Git-Repository zu erstellen, bei dem nur die Geschichte des Stammes bis 2010 zurückreicht. Dann würde ich das später als Zweig in meinem Hauptrepo ziehen und eine Rebase machen, um die Geschichte korrekt zu machen. Aber ich hatte kein Glück, dieses Repo nur für den Kofferraum zu schaffen. Ich habe versucht:

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk --authors ../authors.txt 

und

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk -no-minimize-url --authors ../authors.txt 

ohne Erfolg.

Antwort

10

Ich hatte gerade das gleiche Problem. Hier ist, wie ich es gelöst habe.

Klonen Sie beide Repos separat.

git svn clone -s [original-svn-location] [original-clone-directory] 
git svn clone -s [new-svn-location] [new-clone-directory] 

Fügen Sie die alten geklonten Daten zum neuen Repo hinzu.

cd [new-clone-directory] 
git remote add oldstuff ../[original-clone-directory] 
git fetch oldstuff 

Jetzt kommt der schwierige Teil ... Do git log von master und von oldstuff/master (oder vielleicht trunk und olstuff/trunk - aber Sie es einrichten) und notieren Sie die die erste commit sha aus dem neuen Klon und dem letzten begehe Sha vom alten Klon (kurz vor dem Umzug).

git replace [first-commit-sha-from-new-clone] [last-commit-sha-from-old-clone] 

Und der SHA-Hashes neu zu schreiben, so koscher alles ist und Sie nicht mehr benötigen, die ref ersetzen ...

git filter-branch 

Und nun die nicht mehr benötigten Referenzen aufzuräumen.

git remote rm oldstuff 
rm -rf .git/refs/replace 

Sie verlieren das erste von Ihrer Geschichte begehen, aber da, dass die anfängliche Bewegung sein sollte (dh: kein tatsächlicher Dateiinhalt geändert hat) wird es wahrscheinlich nicht für Sie.

Jetzt sollte alle Geschichte noch beibehalten werden und git blame Berichte erinnern die alte Geschichte des Repos, Ihnen wieder genaue Informationen.

Sie sollten dies so oft wie nötig wiederholen können (abhängig davon, wie oft Ihr Projekt den Root-Speicherort geändert hat und/oder wie viele Zweige auf beiden Seiten des Zuges festgeschrieben wurden).

PS - Diese Lösung, die ich für meine Bedürfnisse angepasst habe, fand ich here (ich konnte seinen Transplantationsansatz nicht für meine Repositorys arbeiten - aber die Verwendung von replace scheint wunderbar zu funktionieren).

+0

Ich kann mich nicht mehr sehr gut an das Problem erinnern, aber ich habe dies als Antwort gewählt, weil das am nächsten kommt, wie ich das Problem gelöst habe. Ich glaube, ich habe eine ganze Reihe von getrennten Zweigen gemacht und sie dann zusammengefügt, indem ich die Geschichte betrachtet habe, wie du sie beschreibst. –

2

Sie können SubGit verwenden, um Ihr SVN-Repository zu konvertieren.

Leider unterstützt die Version 1.0 kein komplexes Layout wie das, das Sie haben. Aber es gibt 1.1 EAP version, die es gut behandelt. Sowohl Version 1.0 als auch Version 1.1 arbeiten mit dem lokalen SVN-Repository, so dass Sie administrativen Zugriff auf das SVN-Repository haben müssen.

Sie wie folgt vor, um SVN-Repository zu Git zu konvertieren:

  1. generieren Anfangskonfiguration.

    $ subgit configure SVN_REPO 
    
  2. Wahrscheinlich erkennt SubGit zwei Projekte in diesem Repository. AFAIU, du brauchst nur ein Git Repository. Also, Sie müssen nur einen 'git' Abschnitt in der Konfigurationsdatei behalten. Geben Sie alle Zweige an, die Sie dort konvertieren müssen.

    $ EDITOR SVN_REPO/conf/subgit.conf 
    [core] 
        ... 
    [git "default"] 
        repository = .git 
        ... 
        trunk = trunk:refs/heads/master 
        branches = branches/*:refs/heads/* 
        tags = tags/*:refs/tags/* 
        shelves = shelves/*:refs/shelves/* 
        branches = iPhone/trunk:refs/heads/iPhone/master 
        branches = iPhone/branches/*:refs/heads/iPhone/* 
        tags = iPhone/tags/*:refs/tags/iPhone/* 
        branches = Android/trunk:refs/heads/Android/master 
        branches = Android/branches/*:refs/heads/Android/* 
        tags = Android/tags/*:refs/tags/Android/* 
        ... 
    [daemon] 
        ... 
    
  3. SVN in Git umwandeln.

    $ subgit install SVN_REPO 
    
  4. In diesem Moment SubGit konvertiert alle Revisionen von SVN auf Git. Sie können das konvertierte Git Repository bei SVN_REPO/.git finden. Zusätzlich hält SubGit SVN- und Git-Repositories synchronisiert und installiert spezielle Hooks, um das zu erreichen. Wenn nötig, diese Haken loswerden.

    $ subgit uninstall --purge SVN_REPO 
    

Das ist alles. Jetzt haben Sie das Git-Repository mit der gesamten gespeicherten Historie konvertiert.

Beachten Sie, dass SubGit ein kommerzielles Produkt ist, aber diese einmalige Konvertierung ist kostenlos. Hoffe, es funktioniert gut für dich.

+0

Das sieht nach einer guten Lösung aus, aber da es eine lange Zeit ist, konnte ich die Lösung nicht überprüfen und als Antwort festlegen. Aber wenn jemand anderes bestätigen kann, dass dies funktioniert, bin ich glücklich, dass dies die richtige Antwort ist. –

Verwandte Themen