Fehler in einem alten Svn-Repository leicht in die neuen Git-Repositories kopieren.

8

Wir haben die meisten unserer Codebasen von einem monolithischen svn -Repository in eine Reihe von git -Repositorys verschoben. Aus verschiedenen Gründen müssen einige Arbeiten (an alten Versionen des im Feld eingesetzten Projekts) in den alten svn -Zweigen fortgesetzt werden, nachdem sie in git verschoben und aus der Subversion trunk gelöscht wurden.

Ich habe so etwas in einem svn Zweig gemacht und die Änderungen aus dem svn Repository in die git Repositories übernommen, indem ich Folgendes gemacht habe:

%Vor%

aber es ist ziemlich umständlich, dies für jedes svn commit zu tun, besonders für den gedit Schritt, wo ich die svn Pfade manuell in git Pfade migrieren muss (normalerweise indem ich die oberste Ebene voranstelle) Verzeichnisname).

Ein Problem beim Ausprobieren einiger der bisher vorgestellten Optionen ist, dass die Struktur des alten svn Repos und des neuen git Repos unterschiedlich ist. Dies ist einer der Gründe, warum ich die Patch-Datei bearbeiten muss.

Die alte Verzeichnisstruktur war

%Vor%

Während die neue Struktur

ist %Vor%

Ich würde wirklich gerne wissen, ob es einen einfacheren Weg gibt, dies zu tun und zu verstehen, was die beste Vorgehensweise für diese Situation ist.

    
Mark Booth 04.07.2012, 15:46
quelle

3 Antworten

1

Wenn Sie davon ausgehen, dass die Verzeichnisstruktur Ihrer Quellen gleich bleibt, schlage ich vor, dass Sie Ihrem alten SVN-Zweig eine Fernbedienung hinzufügen:

%Vor%

Auf diese Weise können Sie Änderungen in alten SVN-Zweigen und Ihrem brandneuen Git-Server in lokalen Niederlassungen verfolgen und git-cherry-pick , um die Commits mit den Fixes auf den Git-Server-Zweigen anzuwenden.

BEARBEITEN

Git verfolgt die Dateibewegungen.

Ich habe es selbst nicht versucht, aber wenn Sie den SVN-Repo klonen, dann verschieben Sie die Verzeichnisse lokal, um sie an Ihre neue Git-Server-Struktur anzupassen. Cherry-Pick-Merges könnten sie auf die verschobenen Dateien anwenden.

Für einige Dateien funktionierte es bereits, aber vielleicht gibt es ein paar Einschränkungen. Es ist definitiv einen Versuch wert.

    
Olivier B. 13.07.2012, 14:40
quelle
2

Sie können git svn verwenden, um Ihren Git Repo mit den Änderungen von svn zu synchronisieren.

%Vor%

Das wird Sie mit den Svn-Quellen in einem Git-Zweig verlassen. Um von Svn zu Git zu synchronisieren:

%Vor%

Wir haben bessere Erfahrungen mit Rebase als mit Merge. Hoffentlich erledigt das auch die Arbeit für Sie.

    
wemu 13.07.2012 09:51
quelle
1

Nichts verbietet es, dass git und svn in der Quellstruktur koexistieren. Dies macht das Auswählen von Commits viel einfacher als das Patchen und Kopieren zwischen verschiedenen Quellbäumen.

  1. svn checkout ein Zweig und eine Revision, die Sie bereits in git haben.
  2. git clone und git checkout der gleiche Quellbaum wie in Schritt 1 (es könnte eine Abkürzung geben, die leere Repositories einbezieht, wenn das Repository sehr groß ist - Sie benötigen nur die .git/ Repository-Daten).
  3. Kopieren Sie das .git/ -Verzeichnis in Ihr svn-Checkout-Stammverzeichnis.
  4. Sagen Sie git , um Subversion-Metadaten zu ignorieren, indem Sie .svn in Ihre .gitignore -Datei einfügen.
  5. Wenn Sie können, können Sie svn propset svn:ignore dirname .git auch ausführen, um svn ignore .git director zu sagen.

Jetzt gibt es viele Methoden, um die Commits zu exportieren. Hier ist eine Methode, wenn Sie commit r12345 übernehmen wollen (unter der Annahme, dass ein Punkt wie oben ist, wo svn und git beide aktuell sind):

  1. temporäre git-Verzweigung erstellen und auschecken ( git checkout -b throway-branch );
  2. erhält einen Wert unterhalb des gewünschten SVN-Commits von svn co -r12344 ;
  3. Übernehmen Sie diese Änderungen (die ignoriert werden sollen) in Ihr git -Repository, indem Sie etwas wie git add -A gefolgt von git commit -m "SVN -r12344 (uninteresting stuff)" ;
  4. eingeben
  5. check das interessante svn commit von svn co -r12345 und
  6. speichere es in deinem Git-Repository: git add -A && git commit --date <svn commit date> (Verwenden Sie hier --date <svn commit date> unter der Annahme, dass Sie das SVN-Commit-Datum beibehalten möchten).
  7. Jetzt können Sie git cherry-pick diese letzte bedeutungsvolle Verpflichtung zu Ihrem tatsächlichen Zweig, den Sie in der Welt veröffentlichen möchten.

Diese Art von Dual-Repository-Setup funktionierte für mich ziemlich gut, als ich einmal mit dem Upstream-Subversion-Repository arbeiten musste, während ich git lokal verwendete. Ich habe am Ende ein paar Skripte gemacht, um das alles einfacher zu machen. Z.B. Für Sie könnte ein Skript das svn-Commit-Datum und die Nachricht aufnehmen und ein git-commit für Sie mit demselben Datum und derselben Nachricht erstellen (mit der svn-Revisionsnummer, die der Nachricht hinzugefügt wurde, um sie mit dem svn-Commit abzugleichen).

Alternativ können Sie auch svn diff --git und git am verwenden, wie Sie in Ihrem Post erwähnen, was viel praktischer ist, da Sie die Patches nicht zwischen verschiedenen Verzeichnissen verschieben müssen und Sie können Ihr einzelnes Arbeitsverzeichnis immer mit Ihrem vergleichen svn checkout und aktuelle git commit jederzeit.

Ich bin nicht vertraut mit git svn zu wissen, ob dies ein nützliches Werkzeug für Sie wäre.

    
FooF 10.07.2012 09:44
quelle

Tags und Links