Also habe ich ein SVN-Repository mit svn2git in ein git-Repository konvertiert, weil ich annahm, dass es am svn-Repository nicht mehr arbeiten würde. Aber jemand anderes wusste nicht, dass wir auf Git umgestiegen sind (es ist ein bisschen kompliziert, aber er arbeitete im Grunde nur an einer bestimmten Datei), also machte er einige Commits für SVN. Jetzt möchte ich diese Commits in git bekommen. Kann ich das noch machen, oder ist svn2git komplett in eine Richtung?
Wenn nicht, gibt es eine Möglichkeit, Patches aus SVN-Commits zu generieren, eine Art Analog zu git format-patch
? Ich kann keinen von einer oberflächlichen Suche finden; Es scheint, als hätten die SVN-Entwickler nie gedacht, Commits in Patches konvertieren zu wollen.
Aus Ihrer Beschreibung klingt es so, als gäbe es nur wenige Commits in Subversion, die Sie abholen möchten. Die direkteste Methode besteht darin, jeden Patch manuell zu extrahieren und anzuwenden, was ich hier skizzieren werde. Zuerst können Sie den Befehl svn diff
verwenden, um die Diffs zu extrahieren (ein "diff" entspricht funktionell einem "Patch").
Dies zeigt den Unterschied zwischen Revision 101 und 102. Sie können diese Ausgabe in eine Datei für den nächsten Schritt umleiten:
%Vor% Nehmen Sie im Git-Repository das Diff aus dem vorherigen Schritt und wenden Sie es mit dem patch
-Programm an:
Das -p0
teilt dem Programm patch
mit, wie nach den im Patch benannten Dateien gesucht wird. Übertragen Sie die Änderungen schließlich an Git:
Mit den Umgebungsvariablen GIT_AUTHOR_*
können Sie die ursprünglichen Autoreninformationen beibehalten, die für die Verlaufspflege hilfreich sein können.
Das oben genannte sollte für Textdateien problemlos funktionieren, aber wenn es sich bei den geänderten Dateien in Subversion um Binärdateien handelt, müssen Sie eine etwas andere Technik verwenden (Subversion wird in diesem Fall keine brauchbaren Unterschiede erzeugen). Anstatt Patches zu extrahieren und anzuwenden, kopieren Sie einfach die Datei (en) von jeder Subversion-Revision in das Git-Repository, bevor Sie sie festschreiben. Dies würde auch gut für Textdateien funktionieren, wenn Sie bevorzugen.
svn2git unterstützt das jetzt mit --rebase. Aus der (aktuellen) Dokumentation:
Ab svn2git 2.0 gibt es ein neues Funktion, um die neuesten Änderungen zu ziehen von SVN in dein Git-Repository erstellt mit svn2git. Das ist eine Eins Way-Sync, aber können Sie verwenden svn2git als Spiegelungswerkzeug für Ihre SVN-Repositories.
Der Aufruf lautet:
%Vor%
Ich habe tatsächlich einen anderen Weg gefunden, dies zu tun. Ich habe svn2git erneut ausgeführt und einen aktualisierten Git-Klon des Svn-Repositorys erhalten. Dann habe ich in meinem alten git-Repository den neueren Klon als Remote hinzugefügt, ihn abgerufen und dann git rebase svnclone2/master
verwendet, um meinen Zweig auf den neu aktualisierten svn2git-Zweig umzuset- zen.
Das bedeutet natürlich, dass meine Commits, die rebasiert wurden, dieselbe Commit-Zeit haben, aber das ist nicht so schlimm. Es ist weniger Arbeit als das manuelle Ausführen von Patches, und da dieses Git-Repository immer noch nicht von jemand anderem als mir benutzt wird, könnte ich den Verlauf neu schreiben, ohne sich über die Konsequenzen Gedanken machen zu müssen. Aber das ist wahrscheinlich keine gute Lösung im Allgemeinen; Das Beste wäre, wenn der Original-Committer git-Zugang bekommt (er ist ein quecksilberartiger Fan, heh) und er muss die Patches selbst einstellen.
Ich denke, du solltest anstelle von svn2git SubGit verwenden. Wenn Sie es in Ihr SVN-Repository installieren
%Vor%es wird eine Git-Schnittstelle erstellen, aber die SVN-Schnittstelle bleibt voll funktionsfähig. Jedes neue SVN-Commit wird automatisch in Git-Commit umgewandelt und umgekehrt (die Konvertierung ist gleichzeitig sicher, so dass man jede Schnittstelle verwenden kann).