2009-10-18 2 views
15

Ich bin ziemlich neu in Git und ich versuche, ein SVN-Repository auf Git zu verschieben. Ich folgte den Leitfaden unten, so dass ich jetzt ein Git-Repo
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/Konvertieren von Svn zu Git, wie man die Zweige nicht nur im Svn Repo Remote zu bekommen?

Also, wenn ich "git branch" git Antworten "* Master" zu tun und wenn ich es tue "git branch -r" i ein auf meinem Server erhalten haben Liste aller Zweige im SVN-Repository.

Meine letzten svn-checkins waren in einer der Filialen, aber als ich das "git svn clone" -stuff gemacht habe, ist mein commits in diesem Zweig (sie sind noch nicht in den trunk eingebunden) in meinem (git) Meisterzweig. Was fehlt mir hier?

Auch, wenn ich auf meiner Entwicklungsmaschine "Git Clone" mache, bekomme ich die Dateien in Ordnung. Aber wenn ich "git branch -r" mache, kann ich nur den Master-Zweig und nicht die Remote-Zweige sehen. "

Da wir das svn-repo alle zusammen loswerden möchte, möchte ich alle svn-Zweige haben in der Git-Repo, so dass sie von den Entwickler-Clients zugegriffen werden können

Wieder bin ich kein totaler Git-Neuling, aber nicht weit davon entfernt.Wenn es also etwas Grundlegendes fehlt mir hier bitte sagen Sie mir .

aktualisieren
Nach einiger RTFM (Mann git-svn) tun löste ich das erste Problem mit Zweig Sachen in dem Master-Zweig

Reset --hard Fernbedienungen/trunk

Jetzt ist der Stamm und der Master-Zweig ist die gleiche. Als nächstes müssen Sie herausfinden, wie Sie die Zweige von den Entwicklungsclients beziehen können.

Update 2
Ich habe es durch die Arbeit der URL oben und die URL kombiniert, die Scott zu spitz. Also, von Anfang an.

ich zuerst ein leeres Repository auf dem Server erstellt wird, werden sie in/usr/local/git-repos auf unserem Server gespeichert:

server> cd /usr/local/git-repos 
server> mkdir my_project.git 
server> cd my_project.git 
server> git init 

Dann ich die SVN-Repository meine dev-Maschine geklont (beachten Sie, dass auf unserem sVN-Server die "Zweige" dir genannt wird "Zweig" witout das 's'):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project 

Dann einige Bereinigungs die Tags und Zweige, um zu erhalten:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ 
dev> rm -Rf .git/refs/remotes/tags 
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/ 
dev> rm -Rf .git/refs/remotes 

Jetzt ist mein Server als Remote-Repository hinzufügen:

dev> git remote add origin [email protected]<our_server>:/usr/local/git-repos/my_project.git 

Schließlich schieben alle Zweige und Tags bis zu dem Server:

dev> git push origin --all 

Puh, jetzt haben Sie es, ich jetzt kann das Svn-Repo loswerden.

Update 3
Kasse ebneters post unten für einen einfacheren Weg, es zu tun ...

Antwort

14

Es gibt eine ziemlich detaillierte Erklärung, wie einen ziemlich guten SVN Import zu tun, die erklären, wie die Zweige konvertieren richtig hier:

https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

Die kurze Antwort ist dies auszuführen:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/ 
$ rm -Rf .git/refs/remotes 

Ich hoffe, das ist hilfreich.

+0

Ich habe diese Methode auf einem Git-Spiegel eines Svn-Servers verwendet, von dem ich weiterhole, und dies bricht irgendwie die Geschichte. Ist das zu erwarten oder mache ich etwas falsch? – Doppelganger

8

Eine andere gute Möglichkeit, dies zu tun, nur für das Protokoll, ist zu verwenden svn2git - Ich bin in der Mitte der Konvertierung mehrere ziemlich große Repositories und es war ein Geschenk des Himmels. Es automatisiert alle Schritte, die erforderlich sind, um sich um Zweige zu kümmern und um svn-Tags in echte git-Tags umzuwandeln.

+0

Ah, das hätte mir viel Arbeit erspart. Aber hey, zumindest weiß ich jetzt mehr über git als zuvor ...:) –

5

Scott Lösung hat nicht für mich funktioniert. Ich vermute, dass sich etwas in einer neueren Version von git-svn geändert hat, seit er das gepostet hat (und seit das verlinkte Buch geschrieben wurde), da es aggressiv Müll zu sammeln scheint, sobald der Klon vollständig ist. Aber das ist nur eine Vermutung, warum es nicht funktioniert hat. Ich benutze Git 1.6.5.6.

Insbesondere mein .git/refs/remotes-Verzeichnis war komplett leer mit Ausnahme eines Tags-Verzeichnisses, das ebenfalls leer war. Also gibt es nichts, was ich kopieren kann, um es richtig zu machen.

Nach einigem Stochern, konnte ich dieses Problem beheben, indem Sie die Datei .git/gepackte-Refs Überprüfung und tun Such- und ersetzen auf den folgenden (in dieser Reihenfolge):

refs/remotes/tags => refs/tags 
refs/remotes => refs/heads 

Wenn Ihr Editor vim, können Sie es mit diesen beiden Befehlen tun:

:%s/refs\/remotes\/tags/refs\/tags/g 
:%s/refs\/remotes/refs\/heads/g 

svn2git 1.3.1 auch kein brauchbares Ergebnis ergab für mich (noch keine Commits nach einem bestimmten Punkt vor einigen Monaten importiert wurden, und Niederlassungen zeigte die gleichen Commits). Im Moment habe ich svn2git aufgegeben und hatte den größten Erfolg mit git-svn kombiniert mit dem oben genannten.

Wunschdenken: Sicher wäre es gut, wenn git-svn einfach einen Befehl wie 'aufgeben' oder 'migrieren' hinzufügen würde, der diesen Prozess auf eine zukunftssichere Weise automatisieren würde.

1

Ich habe 2 SVN Repos zu Git (Git Version 1.7.0.4) nach Scott Rezept migriert, eine kleinere und eine größere. Der kleinere verhielt sich wie von Scott im Buchkapitel beschrieben. Der größere benötigte Davids Lösung. Eine andere Sache ist, dass

$ git push origin --all 

brachte keine Tags schieben und stattdessen hatte ich dies zu tun:

$ git push origin --all 
$ git push origin --tags 

Dies kann nicht offensichtlich von der Flagge --alle und aus dem Buch Kapitel und ich realisierte dies nachdem ich den lokalen Git Svn Repo gelöscht habe.