Ich wanderte zu git mit git-svn. Unser Svn-Repository ist immer noch in Takt und wir bekommen immer noch all die "git awesomeness". Im Wesentlichen nach dem git-svn-Klon verzweigen Sie diesen wieder als Ihren "Stamm". Jeder, der git benutzt, wird von hier aus verzweigen. Wenn Sie Updates von Svn erhalten müssen, tun Sie einfach git-svn rebase und dann git merge --squash aus dem Svn-Zweig an den neuen "Trunk". Und umgekehrt. Das bedeutet, dass Ihr Verlauf auf dem SVN-Repo nicht mit dem in git übereinstimmt. Wenn Sie mehr als eine Zusammenführung durchführen, müssen Sie zu einem bestimmten Zeitpunkt mit der Übertragung beginnen, da der Verlauf nicht übereinstimmt. Wenn Sie jedoch den HEAD Ihres Gittrunks auf die letzte Commit-ID, die ein gequetschtes Merge war, anwenden, erhalten Sie den gleichen Effekt.
Ok, also lass mich das am besten durch ein Beispiel brechen.
SVN Repo: svn: //xyz.com/myproject
git svn clone svn://xyz.com/myproject
Dies sollte man mit einem normalen git-svn-Setup mit einem Master-Zweig verlassen, die die gleiche Geschichte wie der SVN-Repository hat.
git checkout -b git_trunk
git_trunk wird der "Stamm" für die git Benutzer.
Dieser Zweig kann frei wie jedes andere Git Repository verwendet werden.
Nun müssen Sie diese beiden Zweige über git synchronisieren --squash fusionieren
Zum Beispiel .. Zusammenführung von dem Master-SVN-Zweig git_trunk
git checkout git_trunk
git merge --squash master
git commit -a
Sie würden, um die gleiche Sache zu fusionieren von git_trunk zum Master svn außer Sie
git svn dcommit
Dieser Push wird es wieder zu svn ausführen würde.
So ist der komplizierte Teil hier, dass, da wir --squash verwenden, der Verschmelzungsverlauf verloren ist und der einzige gemeinsame Vorfahrengit jemals über den Verzweigungspunkt wissen wird. Dies bedeutet Zusammenführungskonflikte.Die Art und Weise, wie ich es löste, war, indem ich so etwas tat
Zusammenführen von git_trunk zum Master. Zuerst nehme ich die Commit-ID des letzten Squash auf git_trunk. Lass es ABCDEFG nennen. Dann bekomme ich das commit-d von git_trunk. Lassen Sie uns sagen seine HIJKLMNO
echo "HIJKLMNO ABCDEFG" > .git/info/grafts
Dies wird git sagen beim Einarbeiten, dass die gemeinsamen Vorfahren ist die jüngste zerquetschte begehen.
Es ist nicht perfekt, aber es funktioniert gut für mich. Gerade jetzt seit fast jeder auf git ist.
Sie sollten wirklich Subversion Probleme wie diese nicht bekommen. Das Subversion-Repository, das wir bei der Arbeit verwalten, ist ziemlich groß (mehr als 10.000 Dateien) und wir hatten nie irgendwelche Korruptionsprobleme damit. Klingt eher wie ein Hardwareproblem, willkürliche Verfälschungen sollten niemals passieren. – Kezzer
Ich denke, Ihr Repository wird nicht von Nicht-Programmierern verwendet :) Sie können alles kaputt machen. – vava
@vava: Nicht-Programmierer könnten ihre _working copy_ brechen und enorme Mengen an Arbeit verlieren, aber sie sollten definitiv nicht in der Lage sein, _repository_ zu brechen. Etwas scheint dort fischig zu sein, und wenn ich du wäre, würde ich versuchen, herauszufinden, wie das passiert, bevor ich etwas anderes mache. – sbi