1628 Stimmen

Wie migriere ich ein SVN-Repository mit Historie in ein neues Git-Repository?

Ich habe das Git-Handbuch, die FAQ, den Git-SVN-Crashkurs usw. gelesen, und sie alle erklären dies und das, aber nirgends findet man eine einfache Anleitung wie:

SVN-Repository in: svn://myserver/path/to/svn/repos

Git-Repository in: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

Ich erwarte nicht, dass es so einfach ist, und ich erwarte nicht, dass es ein einziger Befehl ist. Aber ich erwarte, dass sie nicht versucht, irgendetwas zu erklären, sondern nur sagt, welche Schritte in diesem Beispiel zu unternehmen sind.

1665voto

cmcginty Punkte 106764

Erstellen Sie eine Benutzerdatei (d. h. users.txt ) für die Zuordnung von SVN-Benutzern zu Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

Sie können diesen Einzeiler verwenden, um eine Vorlage aus Ihrem vorhandenen SVN-Repository zu erstellen:

svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

SVN hält an, wenn es einen fehlenden SVN-Benutzer findet, der nicht in der Datei steht. Aber danach können Sie die Datei aktualisieren und dort weitermachen, wo Sie aufgehört haben.

Ziehen Sie nun die SVN-Daten aus dem Repository:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Dieser Befehl erstellt ein neues Git-Repository in dest_dir-tmp und beginnen Sie mit dem Ziehen des SVN-Repositorys. Beachten Sie, dass das Flag "--stdlayout" voraussetzt, dass Sie das übliche SVN-Layout "trunk/, branches/, tags/" verwenden. Wenn Ihr Layout davon abweicht, machen Sie sich vertraut mit --tags , --branches , --trunk Optionen (im Allgemeinen git svn help ).

Alle gängigen Protokolle sind erlaubt: svn:// , http:// , https:// . Die URL sollte auf das Basis-Repository abzielen, etwa so http://svn.mycompany.com/myrepo/repository . Die URL-Zeichenfolge muss pas einschließen. /trunk , /tag ou /branches .

Beachten Sie, dass es nach der Ausführung dieses Befehls sehr oft so aussieht, als würde der Vorgang "hängen/einfrieren", und es ist ganz normal, dass er nach der Initialisierung des neuen Repositorys für eine lange Zeit stecken bleiben kann. Letztendlich werden Sie dann Logmeldungen sehen, die darauf hinweisen, dass die Migration stattfindet.

Beachten Sie auch, dass Sie, wenn Sie die --no-metadata Flag, fügt Git der Commit-Nachricht Informationen über die entsprechende SVN-Revision hinzu (d.h. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID> )

Wenn kein Benutzername gefunden wird, aktualisieren Sie Ihre users.txt Datei:

cd dest_dir-tmp
git svn fetch

Wenn Sie ein großes Projekt haben, müssen Sie diesen letzten Befehl möglicherweise mehrmals wiederholen, bis alle Subversion-Commits abgerufen wurden:

git svn fetch

Wenn dies abgeschlossen ist, checkt Git das SVN trunk in einen neuen Zweig. Alle anderen Zweige werden als Remotes eingerichtet. Sie können die anderen SVN-Zweige mit anzeigen:

git branch -r

Wenn Sie andere entfernte Zweige in Ihrem Repository behalten wollen, müssen Sie für jeden Zweig manuell einen lokalen Zweig erstellen. (Überspringen Sie trunk/master.) Wenn Sie dies nicht tun, werden die Zweige im letzten Schritt nicht geklont.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same names

Tags werden als Zweige importiert. Sie müssen einen lokalen Zweig anlegen, ein Tag erstellen und den Zweig löschen, um sie als Tags in Git zu haben. Um dies mit dem Tag "v1" zu tun:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Klonen Sie Ihr GIT-SVN-Repository in ein sauberes Git-Repository:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Die lokalen Zweige, die Sie zuvor aus entfernten Zweigen erstellt haben, wurden nur als entfernte Zweige in das neu geklonte Repository kopiert. (Überspringen Sie trunk/master.) Für jeden Zweig, den Sie behalten wollen:

git checkout -b local_branch origin/remote_branch

Entfernen Sie abschließend das Remote aus Ihrem sauberen Git-Repository, das auf das nun gelöschte temporäre Repository verweist:

git remote rm origin

553voto

jfm3 Punkte 35554

Magie:

$ git svn clone http://svn/repo/here/trunk

Git und SVN arbeiten sehr unterschiedlich. Sie müssen Git lernen, und wenn Sie Änderungen aus SVN stromaufwärts verfolgen wollen, müssen Sie lernen git-svn . Die git-svn Die Hauptseite enthält einen Abschnitt mit guten Beispielen :

$ git svn --help

207voto

Eugene Yokota Punkte 92703

Migrieren Sie Ihr Subversion-Repository sauber in ein Git-Repository . Zuerst müssen Sie eine Datei erstellen, die die Namen der Subversion-Commit-Autoren den Git-Commitern zuordnet, zum Beispiel ~/authors.txt :

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Anschließend können Sie die Subversion-Daten in ein Git-Repository herunterladen:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Wenn Sie mit einem Mac arbeiten, können Sie git-svn von MacPorts durch Installation von git-core +svn .

Wenn sich Ihr Subversion-Repository auf demselben Rechner befindet wie Ihr gewünschtes Git-Repository, dann können Sie diese Syntax für den init-Schritt verwenden, ansonsten bleibt alles beim Alten:

git svn init file:///home/user/repoName --no-metadata

74voto

Ich habe die svn2git-Skript und funktioniert wie ein Zauber.

62voto

webmat Punkte 53996

Ich schlage vor, sich mit Git vertraut zu machen, bevor man versucht, git-svn ständig zu verwenden, d.h. SVN als zentrales Projektarchiv zu behalten und Git lokal zu verwenden.

Für eine einfache Migration mit der gesamten Historie gibt es jedoch einige einfache Schritte:

Initialisieren Sie das lokale Projektarchiv:

mkdir project
cd project
git svn init http://svn.url

Markieren Sie, wie weit Sie mit dem Import von Revisionen zurückgehen möchten:

git svn fetch -r42

(oder einfach "git svn fetch" für alle Revisionen)

Holen Sie alles, was seitdem passiert ist:

git svn rebase

Sie können das Ergebnis des Imports mit Gitk überprüfen. Ich bin nicht sicher, ob das unter Windows funktioniert, unter OSX und Linux funktioniert es:

gitk

Wenn Sie Ihr SVN-Repository lokal geklont haben, möchten Sie es vielleicht in ein zentrales Git-Repository verschieben, um die Zusammenarbeit zu erleichtern.

Erstellen Sie zunächst Ihr leeres entferntes Repository (vielleicht auf GitHub ?):

git remote add origin git@github.com:user/project-name.git

Dann synchronisieren Sie optional Ihren Hauptzweig, so dass die Pull-Operation automatisch den entfernten Master mit Ihrem lokalen Master zusammenführt, wenn beide neues Material enthalten:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Danach werden Sie vielleicht daran interessiert sein, meine eigene Methode auszuprobieren git_remote_branch Werkzeug, das den Umgang mit entfernten Zweigen erleichtert:

Erster erläuternder Beitrag: " Git-Fernzweige "

Follow-up für die aktuellste Version: " Zeit für die Git-Zusammenarbeit mit git_remote_branch "

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X