2010-01-08 5 views
20

Ich versuche, Git als Frontend zu einer SVN-Repository zu verwenden, um die Lage sein, Git nette Features wie einfache Verzweigung, etc. zu verwenden stashingKann Git-svn auf großen, verzweigten Repositorien verwendet werden?

Das Problem ist, dass die SVN-Repository ist recht groß (8000 Umdrehungen) und enthält viele Zweige und Tags (alt und neu).

Es ist ein in der Nähe von Standard-Layout, mit einer Config holen enthält, Zweig und Tags-Richtlinien.

Da der älteste Zweig und das letzte Tag sich auf Revision 10 bezieht, bedeutet dies, dass alle svn fetch den gesamten Repository-Verlauf ab Version 10 und vorwärts liest, was bei langsamer Verbindung Stunden dauern kann.

Wenn ich nur Stamm verfolgen, dann ist es in Ordnung, aber ich will noch git bewusst neue Zweige und Tags machen.

Normalerweise schaue ich auf git log -1 auf dem Zweig bin ich und bekomme die SVN-Revision aus dem Kommentar, so kann ich git svn fetch -r7915:HEAD oder ähnliches tun. Ich denke, das ist, was git svn fetch --parent tut. Aber warum muss ich das tun?

Ich bin auf Windows, und verwenden Sie TortoiseGit, die ziemlich nette Unterstützung für git-svn hat, aber da TortoiseGit nur git svn fetch läuft bin ich irgendwie fest.

Mache ich etwas falsch? Ich erwarte, dass svn fetch eine schnelle Operation sein, wenn die ersten svn clone -s abgeschlossen ist.

Antwort

3

Sie verwenden es richtig: der erste Import einer Subversion-Repository mit vielen Geschichte wird sehr langsam sein.

Die schlechte Nachricht ist, weil Subversion Zweige und Tags nur Verzeichnisse sind, git-svn gezwungen ist, die pessimistisch Weg zu nehmen den ganzen Weg zurück in die erste Revision jeder Zweig von seinem Kopf zu lesen. Ja, wenn Sie Subversion diszipliniert haben, führt dies zu vielen Abrufen der gleichen Daten, aber realistische Verwendungsmuster machen dies zu einem unwahrscheinlichen Fall.

den Klon am Abend beginnen und am nächsten Morgen zu einem schönen git Repo kommen zurück!

Sobald Sie geklont haben, git svn fetch sogar warnt Sie:

This may take a while on large repositories

Subversion einfach und dumm ist, so git hat langsam die Dinge zu nehmen.

+1

Danke für die Beantwortung. Ich habe kein Problem damit, dass der anfängliche Klon Zeit braucht, aber dass jede Abrufoperation danach fast alle Revisionen durchlaufen muss, scheint falsch zu sein. –

5

Wenn Sie keine vollständige Historie im Git-Repository benötigen, empfehle ich Ihnen, anstelle der standardmäßigen git-svn-Integration den "git + svn" -Ansatz zu verwenden, der im folgenden Link beschrieben wird. Ihr erster Import in git sollte sehr schnell sein, da Sie keinen Verlauf importieren werden.

Vergewissern Sie sich im Abschnitt „Vorteile, Nachteile und Lessons Learned“ zu lesen.

http://www.lostechies.com/blogs/derickbailey/archive/2010/02/03/branch-per-feature-how-i-manage-subversion-with-git-branches.aspx

+0

Dies ist eine gute Problemumgehung, wenn Sie versuchen, git zu verwenden, um die Unzulänglichkeiten von svn in einer Umgebung zu umgehen, in der Sie nicht in der Lage sind, den vollen Switch zu erstellen. Du brauchst es nicht wirklich, um ein voller Subversion-Client zu sein, nur um dir etwas von der Macht von Git zu geben. Nette Beschreibung. – captncraig

+0

Ich mag auch den "git + svn" -Ansatz, der in dem von @Jordan geposteten Link beschrieben wird. NetBeans (7.0.1) scheint jedoch nicht in der Lage zu sein, damit zu arbeiten. Es identifiziert das Projekt als Subversion-Checkout, kann aber das darin enthaltene Git-Repo nicht sehen. – michael

12

Danke für die Antworten. Sie haben mir nicht wirklich geholfen.

Dieser Befehl ist die beste Lösung bisher:

git svn log --all -1 | \ 
    sed -n '2s/r\\([0-9]*\\).*/\\1/p' | \ 
    xargs --replace=from git svn fetch -r from:HEAD

Es git svn log --all verwendet die höchste SVN-Revisionsnummer zu finden, so weit hergeholt, und holt alles von diesem Zeitpunkt an.

Ich wünschte, git svn fetch würde eine Option haben, sich so zu verhalten. Wenn die SVN-Revisionen nicht geändert werden, gibt es keinen Grund git svn sollten immer die gleichen Revisionen immer wieder abrufen.

+0

Danke, dass Sie das hier veröffentlicht haben. Viele Leute suchen nach Möglichkeiten, Git mit anderen Quellcodeverwaltungssystemen zu verwenden. – Jordan

+1

Auf meinem SVN Repo, der Tonnen von commits hat, ist der obige Befehl schmerzhaft langsam - er zwingt Git-svn, zum Anfang des Repos zurückzugehen, um Geschichte zu finden. – MikeHoss

+0

Die HEAD-Revision der Arbeitskopie lautet: 'git svn find-rev KOPF' so ist der kürzeste Weg zum Abrufen der letzten geholten Revision an die HEAD-Revision der Fernbedienung: ' git svn fetch -r \ 'git svn find-rev HEAD \ ': KOPF' –

0

Haben Sie Symlinks im SVN Repo? Wenn nicht, müssen Sie diese Einstellung versucht:

svn.brokenSymlinkWorkaround

Dies deaktiviert potentiell teure Kontrollen gebrochen Symlinks zu umgehen, indem gebrochen Kunden überprüft in SVN. Setzen Sie diese Option auf "false", wenn Sie ein SVN-Repository mit vielen leeren Blobs verfolgen, die keine Symlinks sind. Diese Option kann geändert werden, während git svn ausgeführt wird und auf die nächste Version wirksam wird. Wenn es nicht gesetzt ist, nimmt git svn an, dass diese Option "wahr" ist.

Verwandte Themen