Ich habe meine ganze Arbeit in Git gemacht und auf GitHub gepusht. Ich war sowohl mit der Software als auch mit der Website sehr zufrieden und möchte an dieser Stelle meine Arbeitspraktiken nicht ändern.
Mein Doktorvater bittet alle Studenten, ihre Arbeit in einem SVN-Repository zu behalten, das an der Universität gehostet wird. Ich habe unzählige Dokumentationen und Tutorials gefunden, um ein vorhandenes SVN-Repository in Git abzurufen, aber nichts darüber, ein Git-Repository in ein neues SVN-Repository zu verschieben. Ich gehe davon aus, dass es einen Weg geben muss, dies mit einer Kombination aus git-svn und einem frischen Zweig und Rebasing und all diesen wunderbaren Begriffen zu tun, aber ich bin ein Git-Neuling und fühle mich mit keinem von ihnen sicher.
Ich möchte dann nur ein paar Befehle ausführen, um Commits an dieses SVN-Repository zu senden, wenn ich dies wähle. Ich möchte weiterhin Git verwenden und nur das SVN-Repository spiegeln lassen, was in Git enthalten ist.
Ich werde die einzige Person sein, die sich jemals für SVN engagiert, wenn dies einen Unterschied macht.
Antworten:
Ich brauchte das auch, und mit Hilfe von Bombes Antwort + einigem Herumspielen konnte ich es zum Laufen bringen. Hier ist das Rezept:
Git importieren -> Subversion
Nach # 3 erhalten Sie eine kryptische Nachricht wie folgt:
Ignoriere das einfach.
Wenn Sie # 5 ausführen, können Konflikte auftreten. Beheben Sie diese Probleme, indem Sie Dateien mit dem Status "nicht zusammengeführt" hinzufügen und die Rebase fortsetzen. Schließlich sind Sie fertig; Synchronisieren Sie dann mit dem SVN-Repository
dcommit
. Das ist alles.Repositorys synchron halten
Sie können jetzt mit den folgenden Befehlen von SVN zu Git synchronisieren:
Verwenden Sie zum Synchronisieren von Git zu SVN Folgendes:
Schlussbemerkung
Möglicherweise möchten Sie dies auf einer lokalen Kopie ausprobieren, bevor Sie sich bei einem Live-Repository bewerben. Sie können eine Kopie Ihres Git-Repositorys an einem temporären Ort erstellen. Verwenden Sie einfach
cp -r
, da sich alle Daten im Repository selbst befinden. Anschließend können Sie ein dateibasiertes Test-Repository einrichten, indem Sie Folgendes verwenden:Und überprüfen Sie eine Arbeitskopie mit:
So können Sie mit den Dingen herumspielen, bevor Sie dauerhafte Änderungen vornehmen.
Nachtrag: Wenn Sie es vermasseln
git svn init
Wenn Sie versehentlich
git svn init
mit der falschen URL ausgeführt wurden und nicht klug genug waren, um eine Sicherungskopie Ihrer Arbeit zu erstellen (fragen Sie nicht ...), können Sie denselben Befehl nicht einfach erneut ausführen. Sie können die Änderungen jedoch rückgängig machen, indem Sie Folgendes ausgeben:Und entfernen Sie den Abschnitt
[svn-remote "svn"]
Abschnitt.Sie können dann erneut ausführen
git svn init
.quelle
So haben wir es geschafft:
Klonen Sie Ihr Git-Repository irgendwo auf Ihrem Computer.
Öffnen Sie .git / config und fügen Sie Folgendes hinzu (unter Verwalten eines schreibgeschützten SVN-Spiegels eines Git-Repositorys ):
Geben Sie nun in einem Konsolenfenster Folgendes ein:
Wenn es hier aus irgendeinem Grund kaputt geht, geben Sie diese drei Zeilen ein:
Und schließlich können Sie sich zu SVN verpflichten:
Hinweis: Ich verschrotte diesen Ordner immer danach.
quelle
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.Bei
git rebase
direkter Verwendung wird das erste Commit verloren. Git behandelt es anders und kann es nicht neu gründen.Es gibt ein Verfahren, bei dem der vollständige Verlauf beibehalten wird: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
Ich werde die Lösung hier transkribieren, aber Credits sind für Björn.
Git-svn initialisieren:
Das --prefix gibt Ihnen Fernverfolgungszweige wie "svn / trunk", was nett ist, weil Sie keine mehrdeutigen Namen erhalten, wenn Sie Ihren lokalen Zweig dann nur "trunk" nennen. Und
-s
ist eine Verknüpfung für das Standardlayout für Trunk / Tags / Zweige.Holen Sie sich die ersten Sachen von SVN:
Suchen Sie nun den Hash Ihres Root-Commits (sollte ein einzelnes Commit anzeigen):
Holen Sie sich dann den Hash des Commits für den leeren Trunk:
Erstellen Sie das Transplantat:
Jetzt sollte "gitk"
svn/trunk
als erstes Commit angezeigt werden , auf dem Ihr Hauptzweig basiert.Machen Sie das Transplantat dauerhaft:
Lassen Sie das Transplantat fallen:
Gitk sollte sich immer noch
svn/trunk
in der Abstammung des Meisters zeigen.Linearisieren Sie Ihren Verlauf über dem Kofferraum:
Und jetzt sollte "git svn dcommit -n" Ihnen sagen, dass es auf Trunk festgeschrieben wird.
quelle
Erstellen Sie ein neues Verzeichnis im Subversion-Repository für Ihr Projekt.
Wechseln Sie zu Ihrem von Git verwalteten Projekt und initialisieren Sie git-svn.
Dadurch wird ein einzelnes Commit erstellt, da Ihr SVN-Projektverzeichnis noch leer ist. Stellen Sie nun alles auf dieses Commit zurück,
git svn dcommit
und Sie sollten fertig sein. Es wird jedoch Ihre Commit-Daten ernsthaft durcheinander bringen.quelle
Git -> SVN mit vollständigem Commit-Verlauf
Ich hatte ein Git-Projekt und musste es nach SVN verschieben. So habe ich es gemacht und die gesamte Commit-Geschichte beibehalten. Das einzige, was verloren geht, ist die ursprüngliche Festschreibungszeit, da libSVN die Ortszeit festlegt, wenn wir dies tun
git svn dcommit
.Wie man:
Haben Sie ein SVN-Repository, in das wir unsere Inhalte importieren und mit git-svn klonen möchten:
Geh dorthin:
Fügen Sie die Fernbedienung des Git-Repositorys hinzu (in diesem Beispiel verwende ich C: /Projects/repo.git ). Sie möchten zu SVN pushen und ihm den Namen old-git geben:
Rufen Sie die Informationen aus dem Hauptzweig vom Old-Git-Repository in das aktuelle Repository ab:
Checken Sie den Hauptzweig der Old-Git-Fernbedienung in einen neuen Zweig namens old im aktuellen Repository aus:
Rebase, um den KOPF auf Old-Git / Master zu setzen. Dadurch bleiben alle Ihre Commits erhalten. Dies bedeutet im Grunde, dass Sie Ihre gesamte Arbeit in Git auf die Arbeit setzen, auf die Sie über SVN zugreifen.
Gehen Sie jetzt zurück zu Ihrer Hauptniederlassung:
Und Sie können sehen, dass Sie einen sauberen Commit-Verlauf haben. Dies ist, was Sie zu SVN pushen möchten.
Schieben Sie Ihre Arbeit zu SVN:
Das ist alles. Es ist sehr sauber, kein Hacken und alles funktioniert sofort. Genießen.
quelle
git svn
Vorbereitungen benötigt.Ich würde eine sehr kurze Anweisung in 4 Befehlen mit SubGit vorschlagen . Siehe diesen Beitrag für Details.
quelle
Ich musste mein vorhandenes Git-Repository in ein leeres SVN-Repository übertragen.
So habe ich es geschafft:
Es hat ohne Probleme funktioniert. Ich hoffe das hilft jemandem.
Da ich mich mit einem anderen Benutzernamen als dem SVN-Repository autorisieren musste (ich
origin
verwende die Authentifizierung mit privatem / öffentlichem Schlüssel), musste ich die--username
Eigenschaft verwenden.quelle
git-svn
bevor dies möglich ist. Siehe stackoverflow.com/questions/527037/git-svn-not-a-git-commandWenn Sie weiterhin mit Git als Haupt-Repository arbeiten möchten und nur die Revisionen von Zeit zu Zeit in SVN "exportieren" müssen, können Sie Tailor verwenden , um das SVN-Repository synchron zu halten. Es kann Revisionen zwischen verschiedenen Versionsverwaltungssystemen kopieren und würde den SVN mit den Änderungen aktualisieren, die Sie in Git vornehmen.
Ich habe keine Git-zu-SVN-Konvertierung versucht, aber für ein SVN -> SVN-Beispiel siehe diese Antwort .
quelle
Noch eine Sequenz, die funktioniert hat (mit einigen Kommentaren zu jedem Schritt):
Installation
git-svn
undsubversion
Toolkits:Schalten Sie in die
PROJECT_FOLDER
Erstellen Sie den Projektpfad auf dem Subversion-Server (leider
git-svn
weist das aktuelle Plugin im Vergleich zu TortoiseSVN einen Defekt auf). Es ist nicht möglich, Quellcode direkt in der zu speichernPROJECT_FOLDER
. Stattdessen wird standardmäßig der gesamte Code in hochgeladenPROJECT_FOLDER/trunk
.svn mkdir - Elternprotokoll: /// path / to / repo / PROJECT_FOLDER / trunk -m "Git Repo Platzhalter erstellen"
Dies ist der Ort, an dem
trunk
am Ende des Pfades obligatorisch istInitialisieren Sie den
git-svn
Plugin-Kontext im.git
OrdnerDies ist der Ort, an dem
trunk
am Ende des Pfades keine Notwendigkeit bestehtRufen Sie eine leere
Subversion
Repository-Information abDieser Schritt hilft dabei, den Subversion-Server mit dem
git-svn
Plugin zu synchronisieren . Dies ist der Moment, in dem dasgit-svn
Plugin denremotes/origin
Pfad erstellt und ihn demtrunk
Unterordner auf der Serverseite zuordnet.Das Zurücksetzen alter Git-Commits erfolgte, bevor das
git-svn
Plugin in den Prozess einbezogen wurde (dieser Schritt ist optional ).Fügen Sie neue / geänderte Dateien zum Festschreiben hinzu (dieser Schritt ist für Git-Aktivitäten normal und optional ).
Übertragen Sie frisch hinzugefügte Dateien in das lokale Git-Repository (dieser Schritt ist optional und gilt nur, wenn Schritt 7 verwendet wurde):
Durch Verschieben des gesamten Projektänderungsverlaufs auf den Subversion-Server:
quelle
Sie können ein neues SVN-Repository erstellen. Exportieren Sie Ihr Git-Projekt (Ausarbeitung der Git-Dateien). Fügen Sie es dem SVN-Repository hinzu (Initialisieren Sie das Repository mit dem, was Sie bisher in Git hatten). Verwenden Sie dann die Anweisungen zum Importieren von SVN-Repositorys in ein neues Git-Projekt.
Dies verliert jedoch Ihre vorherige Git-Geschichte.
quelle
Wenn Sie keine bestimmte SVN verwenden müssen und GitHub verwenden, können Sie deren SVN-Connector verwenden.
Weitere Informationen finden Sie hier: Zusammenarbeit auf GitHub mit Subversion
quelle
Ich möchte ein großartiges Tool teilen, das in der WordPress-Community verwendet wird und Scatter heißt
Git WordPress Plugins und ein bisschen Vernunftstreuung
Auf diese Weise können Benutzer ihr Git-Repository automatisch an wordpress.org SVN senden. Theoretisch kann dieser Code auf jedes SVN-Repository angewendet werden.
quelle
Ich musste kürzlich mehrere Git-Repositorys auf SVN migrieren, und nachdem ich alle Lösungen ausprobiert hatte, die ich finden konnte, funktionierte für mich schließlich Mercurial (ja, mit einem dritten VCS). Mit diesem Handbuch habe ich den folgenden Prozess entwickelt (unter Linux, aber die Grundidee sollte auch unter Windows funktionieren).
Die notwendigen Pakete:
Mercurial muss konfiguriert werden, indem Folgendes hinzugefügt wird
~/.hgrc
:Erstellen Sie einige temporäre Arbeitsverzeichnisse (ich musste mehrere Repositorys migrieren, also habe ich Verzeichnisse für die SVN- und Git-Versionen erstellt, um sie getrennt zu halten):
Erstellen Sie ein leeres lokales SVN-Repository:
Klonen Sie das vorhandene Git-Repository:
Lassen Sie Mercurial sein Ding machen:
Jetzt sollte das SVN-Repository den vollständigen Festschreibungsverlauf enthalten, jedoch nicht mit den ursprünglichen Zeitstempeln. Wenn dies kein Problem ist, überspringen Sie den nächsten Teil mit Schritt 11.
Mit ein wenig Arbeit können Datum und Uhrzeit jedes Commits geändert werden . Da meine Repositories ziemlich klein sind, war es für mich möglich, dies manuell zu tun. Erstellen Sie zunächst einen
pre-revprop-change
Hook im SVN-Repository mit den folgenden Inhalten, damit die erforderliche Eigenschaft geändert werden kann:Dieses Skript muss ausführbar gemacht werden:
Mercurial hat eine Arbeitskopie des SVN-Repositorys mit dem Namen project -wc erstellt. Wechseln Sie also dorthin und bearbeiten Sie die Festschreibungszeiten:
Geben Sie das richtige Datum und die richtige Uhrzeit ein (achten Sie auf Zeitzonen!) Und speichern Sie. Sie sollten die Meldung "Neuen Wert für Eigenschaft svn: Datum bei Revision 1 festlegen" erhalten.
Jetzt spülen und für jede weitere Revision wiederholen.
Überprüfen Sie optional den Commit-Verlauf, um sicherzustellen, dass alles in Ordnung ist:
Dann gehe eine Ebene zurück:
Speichern Sie das Repository:
Und laden Sie den Speicherauszug auf Ihren Subversion-Server. Erledigt!
Dieser Prozess würde wahrscheinlich auch direkt zwischen Remote-Repositorys funktionieren, aber ich fand es einfacher, mit lokalen Repositorys zu arbeiten. Das Festlegen der Festschreibungszeiten war eine Menge Arbeit, aber insgesamt war der Prozess viel einfacher als jede andere Methode, die ich gefunden habe.
quelle
Es gibt drei Methoden:
Rebase: wie die anderen Antworten
Commit - ID: Finden Sie svn erste id begehen und git erster id verpflichten, Echo ihrer in .git / info / Transplantate:
echo "git_id svn_id}" > .git/info/grafts
danngit svn dcommit
Checke jedes Git-Commit aus, kopiere Dateien in svn_repo, svn commit
Bash-Demo: Github-Demo
v1.x: Verwenden Sie Rebase und Commit-ID
v2.x: Verwenden Sie Kopierdateien und dann svn commit
quelle
In meinem Fall musste ich ein sauberes Projekt von SVN initiieren
Fügen Sie alle Ihre Projektquellen hinzu ...
quelle
Ich möchte nur einige meiner Erfahrungen mit der akzeptierten Antwort teilen. Ich habe alle Schritte gemacht und alles war in Ordnung, bevor ich den letzten Schritt ausgeführt habe:
Ich fand den Thread https://github.com/nirvdrum/svn2git/issues/50 und schließlich die Lösung, die ich in der folgenden Datei in Zeile 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm angewendet habe
ich ersetzte
mit
Dies hat mein Problem behoben.
quelle
Was ist, wenn Sie nicht jedes Commit, das Sie in Git vornehmen, in das SVN-Repository übertragen möchten ? Was ist, wenn Sie nur selektiv Commits über die Pipe senden möchten? Nun, ich habe eine bessere Lösung.
Ich behalte ein lokales Git-Repository, in dem ich nur SVN abrufe und zusammenführe. Auf diese Weise kann ich sicherstellen, dass ich dieselben Änderungen wie SVN einbeziehe, aber meinen Commit-Verlauf vollständig vom SVN getrennt halte.
Dann behalte ich eine separate lokale SVN-Arbeitskopie, die sich in einem separaten Ordner befindet. Das ist derjenige, von dem ich Commits zurück zu SVN mache, und ich benutze dafür einfach das SVN-Befehlszeilenprogramm.
Wenn ich bereit bin, den Status meines lokalen Git-Repositorys auf SVN zu übertragen, kopiere ich einfach das gesamte Durcheinander von Dateien in die lokale SVN-Arbeitskopie und schreibe es von dort mithilfe von SVN anstelle von Git fest.
Auf diese Weise muss ich nie eine Neubasis durchführen, da eine Neubasierung wie ein Freebasing ist.
quelle