2009-08-21 5 views
6

Ich bin müde von Subversion, es korrumpiert sein eigenes Repository. Da ich für lange Zeit Kuriositäten von git war und immer ausprobieren wollte, habe ich mich dazu entschlossen, git-svn zu benutzen. Aber beim Durchlesen der Dokumentation wurde mir klar, dass man nicht viel git awesomeness damit verwenden kann. Sie können git-pull nicht verwenden, es wird nicht empfohlen, lokale Zweige zu erstellen, und es gibt eine Menge Einschränkungen. Es sieht so aus, als ob es nicht viel besser ist, Subversion direkt zu benutzen. Oder ist es? Was für Vor- und Nachteile git-svn hat einfach nur svn?Was sind Vor- und Nachteile der Verwendung von Git-Svn?

PS. Es tut mir leid, aber ich frage dich nicht, wie ich mein Subversion-Repository reparieren soll, das ist mir egal. Löschen aller .svn und Checkout im selben Verzeichnis über Nacht funktioniert gut. Ich habe mich nur gefragt, welche Vorteile git-svn bringen könnte.

+7

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

+3

Ich denke, Ihr Repository wird nicht von Nicht-Programmierern verwendet :) Sie können alles kaputt machen. – vava

+0

@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

Antwort

4

Pro:

  • Alles, was gut Git ist für:
    • Netzwerk-freien Zugang zu allen alten verpflichtet
    • Commit und rebase in Git (wieder, Netzwerk frei) und dann git svn dcommit drücken alle Änderungen SVN für einen schönen sauber begehen
    • Günstige lokale Verzweigung (nicht sicher, warum sagen Sie das nicht so gut funktioniert)
  • Sie haben nicht so viel mit SVN beschäftigen :)

Nachteile:

  • Viel besser Workflow, wenn Sie bereits beide Git und SVN kennen (also nicht so gut für die neue Source-Control-Benutzer)
  • sonst jemand verwirren, wenn sie auf das, was suchen sind Sie
  • tun
  • einige Funktionen SVN (wie svn: keywords) nicht verfügbar/bequeme
+0

Ich bin gezwungen, SVN an der Universität zu verwenden und trotzdem Git mit der SVN Bridge zu benutzen. Das heißt, Sie können Git nicht vollständig ausnutzen, bis SVN aus der Gleichung ist. –

2

Meine Erfahrung mit git-svn ist, dass es in erster Linie für (erfahrene) Git-Benutzer nützlich ist, die eine Git-ähnliche Schnittstelle zu einem Subversion Repo haben wollen. Das Assimilieren sowohl der git-Menge von Konzepten als auch der Beschränkungen von git-svn war zumindest für mich zu viel.

Wenn Sie können, würde ich empfehlen, dass Sie vollständig zu git wechseln.

Ich habe viele Leute gesehen, die sich über Subversion beschweren, aber soweit ich weiß, ist es ziemlich stabil. Sind Sie sicher, dass Sie keine Hardwareprobleme haben?

+0

Ja, ich bin sicher :) Es bricht manchmal ab, wenn die Dateinamen zu lang sind oder wenn die Verbindung mitten im Commit nach Süden geht. Der Umgang mit einem 2GB-Repository ist für eine schlechte Subversion nicht einfach. Schade, dass ich nicht komplett zu Git wechseln kann. – vava

+0

Haben Sie in den SVN-Mailinglisten um Hilfe gebeten? Ich wette, sie wären sehr an solchen Problemen interessiert. – sbi

+0

Es ist nutzlos, ich habe keinen Testfall, um sie trotzdem zu zeigen. – vava

0

Ich sehe keine Probleme, alle SVN-Repository auf Git zu migrieren, die Geschichte und alle anderen darin zu halten, und dann auf git ganz zu wechseln.

2 GB ist zu viel für ein einzelnes Repository. Kann es sich lohnen, es in Teile zu teilen?

+0

Leider bin ich nicht der einzige Angestellte :) Und diese Nicht-Programmierer könnten Menschen Tortoise SVN in gewissem Maße verstehen, git wäre zu hart auf sie. Eine Migration auf Git ist also leider keine Option. – vava

1

Wenn die Nutzung ist:

  • „Wir halten SVN aber haben Git für eine schnelle interne Verzweigung“, keine Notwendigkeit, git-svn benutzen können Sie ‚git init‘ direkt in einer Filiale Ihrer Subversion Arbeitsbereich und git Hack direkt in diesem Teil des Codes.

Aber wenn dies:

  • "Wir pflegen beide eine zentrale SVN Repo und ein Git-Repo" ist, dann sind die Dinge etwas komplizierter, denn:
    • ein einfaches git-svn wird reproduzieren die "SVN-Zweige" (eigentlich einfaches Verzeichnis mit Kopien darin), so würde ich empfehlen, svn2git and git2svn
    • zu versuchen, zu importieren alles in einem Git-Repository ist nicht immer eine gute Idee (siehe "What are the git limits?"): Wenn Ihr System aus verschiedenen Modulen besteht, die unabhängig voneinander entwickelt werden können, können sie in einem einzigen zentralen SVN-Repository leben, aber sie sollten ihr eigenes Git Repo (in um in der Lage zu sein, nur die Module ziehen Sie benötigen)
1

ich glaube, die Änderung zu git Ihre Probleme nicht lösen. Wenn Sie "Nicht-Programmierer" in Ihrer Arbeitskraft haben, werden sie die Arbeitskopie anderer Leute brechen (ich nehme an, indem ich Verzeichnisse oder Dateien umbenenne oder entferne).

Wenn Sie git-svn oder git oder was auch immer andere VCS verwenden und Leute ihre Verzeichnisse noch umbenennen/entfernen, wie sollte das besser werden?

Ich denke, Sie sollten versuchen, einige der Leute zu trainieren, um die grundlegenden Konzepte von VCS zu verstehen.

Wenn die Leute SVN-Workflows nicht verstehen, bezweifle ich, dass sie git-svn oder git beherrschen werden.

+0

Deshalb möchte ich mich hinter Git-Svn verstecken :) Ich weiß es nicht sicher, aber ich würde gerne denken, dass Git nur mehr fortgeschritten ist und nicht so leicht brechen wird. – vava

+0

git-svn wird mehr Komplexität einführen und wird so leicht wie svn zusammenbrechen, wenn Sie Dateien wild löschen und umbenennen und versuchen zu verschmelzen. Sie sollten wirklich nach der Quelle Ihrer Probleme suchen. –

3

Dies sind die spezifischen Pro und Con mit git-svn. Es geht also nicht wirklich um den Git selbst.

Pro:

Die Tendenz der Menschen svn ist große Veränderungen auf einmal zu begehen, weil Sie über den Draht verpflichten müssen. Dieser Ansatz kann schlecht sein, da die Änderungen manchmal nicht miteinander in Beziehung stehen. z. B .: Sie können Änderungen mit Bugfixes und Änderungen für neue Funktionen vornehmen, die für einen Änderungssatz festgelegt wurden. Mit git kann ich mich so oft in mein lokales Git-Repository einloggen (besonders wenn ich nicht mit einem Netzwerk verbunden bin) und einen Changeset so klein wie möglich haben. Ich verpflichte mich dann zu SVN (mit 'git svn dcommit'), wenn das ganze große Änderungen bereit ist.

Con:

Die con SVN, wie die Remote-Repository verschmilzt, vor allem, wenn es Konflikte gibt. Es kann manchmal schmerzhaft sein. Ich benutze IntelliJ als meine IDE und um Konflikte zu lösen, muss ich in die Befehlszeile gehen, um es zu beheben. Ich weiß, dass ich oft auf dieses Problem stoße, I have documented it und jetzt wird es für mich keine große Sache mehr.

+5

Ihr Link ist tot. –

3

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.

+0

Also hast du ein öffentliches Git-Repository erstellt, das jeder benutzt, der den Git liebt und ab und zu setzt man alle diese Leute in die Haupt-Subversion ein. Arme Leute, die auf Svn gegangen sind, können die Schuld nicht mehr benutzen :) – vava