2009-10-28 6 views
20

Unsere Firma Subversion Repo ist ein bisschen schwierig: Wir haben ein grundlegendes „default“ Layout mit trunk, tags und Zweig bekommen. Innerhalb der Zweige haben wir jedoch ein "Arbeits" -Verzeichnis, das mehr Zweige enthält. Etwas wie folgt aus:Git-SVN mit mehreren Zweigstellen?

  • branches/release_1_0_x
  • branches/release_1_1_x
  • branches/Arbeit/dave/topic_one
  • Zweige/work/tom/topic_two
  • branches/Arbeit/something_else

Nun, wie kann ich git-svn all jene zu erkennen (und ein paar mehr) als separater Zweig? Es scheint git svn init nur eine Zweigstelle übernimmt, wie auch immer ich bin es aufgerufen wird.

bearbeitet: Das ist, wie ich die git Repo initialisiert:

git svn clone -s --prefix=svn/ http://svn.company.com/product/ 

Antwort

9

Nach der Antwort auf another question, Ihre beste Wette ist Git 1.6.x zu verwenden und die Vorteile von „tiefem Klonen“ zu nehmen.

Wenn Sie nicht auf 1.6.x aktualisieren können, dann können Sie mehrere Zweige angeben, wenn Sie klonen.

git svn clone -s --prefix=svn/ -b branches -b branches/work/dave -b branches/work/tom ... 

Sie müssen nur sicherstellen, dass Sie Informationen für neue Benutzer auf Ihre .git/config vor „git svn holen“ ing hinzufügen, wenn ein neuer Benutzer Zweig hinzugefügt.

+0

Dies ist in der Tat genau das, was ich brauche. Danke für den Link! –

+4

Wie sieht das aus, dass Ihre .git/config-Datei aussieht, da ich Git 1.7 verwende und das rückwirkend machen möchte? – whaley

+0

Ich habe das versucht, aber es hat auch einen Zweig namens "Arbeit". Gibt es eine Möglichkeit, die Sache "Arbeit" zu machen, ist nicht ihr eigener Zweig, sondern "Arbeit/etwas"? Möglicherweise mit --ignore-Pfaden? –

11

Für diejenigen, die dies nachträglich zu tun, die git-svn manpage for 1.7.x sagt:

Es ist auch möglich, durch die Verwendung einer durch Kommata getrennte Liste von Namen innerhalb Klammern eine Teilmenge von Zweigen oder Tags zu holen. Zum Beispiel:

[svn-remote "huge-project"] 
    url = http://server.org/svn 
    fetch = trunk/src:refs/remotes/trunk 
    branches = branches/{red,green}/src:refs/remotes/branches/* 
    tags = tags/{1.0,2.0}/src:refs/remotes/tags/* 
+0

Danke! In meinem Fall konnte ich es nicht so klonen, aber ich klonte, editierte .git/config, um die Zweige wie aufgelistet hinzuzufügen und ran'git svn fetch'. Jetzt zeigen 'git branch -a' oder' git branch -r' die Zweige - woot! – sage

28

Sie können mehrere Zweige und Tags Einträge in Ihrem git-svn Config, fügen sogar rückwirkend. Also, wenn normalerweise SVN-Zweige in branches/* in Ihrem SVN Repo leben (. Dh ein Standard-Layout), aber Sie haben auch branches/summer-students/*, können Sie es in .git/config wie folgt einstellen:

[svn-remote "svn"] 
    url = svn+ssh://svn.example.com 
    fetch = trunk:refs/remotes/trunk 
    branches = branches/*:refs/remotes/* 
    tags = tags/*:refs/remotes/tags/* 

    branches = branches/summer-students/*:refs/remotes/svn-summer-students/* 

Auf der linken Seite des : ist der Pfad im SVN Repo, und auf der rechten Seite ist der Pfad, wie er in deiner Git Remote Branch Liste erscheint. Sie können refs/remotes/* wiederholt verwenden, um alles als Top-Level-Remote-Zweig erscheinen, aber achten Sie auf Namenskollisionen - sie werden die Dinge brechen (daher svn-summer-students statt summer-students, was bereits vorhanden ist). Nachdem Sie die Konfiguration bearbeitet haben, müssen Sie .git/svn/.metadata löschen und git svn fetch ausführen, um die Verzweigungsliste zu aktualisieren und neu zu generieren. git branch -r sollte dann die zusätzlichen Zweige anzeigen. Wenn Sie Fehler erhalten, achten Sie auf Namenskollisionen.

Die git svn docs haben einige weitere Beispiele von Pfaden über Platzhalter oder Ausdrücke spezifizieren, wenn Sie eine funky SVN Layout.

+0

ein Lebensretter, der mich 4 Tage Zeit gerettet hat! – prusswan

+0

Schöne Erklärung, funktioniert wie ein Charme! –