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