Frage Wie migriere ich ein SVN-Repository mit dem Verlauf in ein neues Git-Repository?


Ich habe das Git-Handbuch, FAQ, Git - SVN-Crashkurs usw. gelesen und sie alle erklären dies und das, aber nirgendwo finden Sie eine einfache Anweisung 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 es nicht versucht, etwas zu erklären - nur um zu sagen, welche Schritte wir in diesem Beispiel unternehmen müssen.


1392
2017-09-17 02:08


Ursprung


Antworten:


Zauber:

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

Git und SVN arbeiten sehr unterschiedlich. Sie müssen Git lernen, und wenn Sie Änderungen von SVN Upstream verfolgen möchten, müssen Sie lernen git-svn. Das git-svn Man-Seite hat einen guten Beispielteil:

$ git svn --help

495
2017-09-17 18:20



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>
...

Mit diesem One-Liner können Sie eine Vorlage aus Ihrem vorhandenen SVN-Repository erstellen:

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

SVN stoppt, wenn ein fehlender SVN-Benutzer nicht in der Datei gefunden wird. Aber danach können Sie die Datei aktualisieren und dort abholen, 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 fange an, das SVN-Repository zu ziehen. Beachten Sie, dass das Flag "--stdlayout" impliziert, dass Sie das allgemeine SVN-Layout "trunk /, files /, tags /" haben. Wenn Ihr Layout anders ist, sollten Sie sich damit vertraut machen --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 ausgerichtet sein http://svn.mycompany.com/myrepo/repository. Das muss nicht einschließen /trunk, /tag oder /branches.

Beachten Sie, dass nach dem Ausführen dieses Befehls sehr oft die Operation "hängen / eingefroren" aussieht, und es ist ganz normal, dass sie nach dem Initialisieren des neuen Repositorys für eine lange Zeit hängen bleiben kann. Schließlich werden Sie dann Log-Nachrichten sehen, die anzeigen, dass es migriert.

Beachten Sie auch, dass wenn Sie das weglassen --no-metadata Flag wird Git Informationen über die entsprechende SVN-Revision an die Commit-Nachricht anhängen (d. h. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Wenn ein Benutzername nicht gefunden wird, aktualisieren Sie Ihre users.txt Datei dann:

cd dest_dir-tmp
git svn fetch

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

git svn fetch

Nach Abschluss überprüft Git das SVN trunk in eine neue Filiale. Alle anderen Zweige sind als Fernbedienungen eingerichtet. Sie können die anderen SVN-Zweige anzeigen mit:

git branch -r

Wenn Sie andere Remote-Zweigstellen in Ihrem Repository beibehalten möchten, müssen Sie für jede manuell eine lokale Verzweigung erstellen. (Stamm / Master überspringen.) 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 name

Tags werden als Zweige importiert. Sie müssen eine lokale Verzweigung erstellen, ein Tag erstellen und die Verzweigung löschen, um sie als Tags in Git zu haben. Um es 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 Zweigstellen erstellt haben, wurden nur als Remote-Zweige in das neue geklonte Repository kopiert. (Stamm / Master überspringen.) Für jeden Zweig, den Sie behalten möchten:

git checkout -b local_branch origin/remote_branch

Entfernen Sie schließlich die Remote-Verbindung von Ihrem sauberen Git-Repository, das auf das jetzt gelöschte temporäre Repository verweist:

git remote rm origin

1466
2017-09-17 17:09



Säubern Sie Ihr Subversion-Repository sauber zu einem Git-Repository. Zuerst müssen Sie eine Datei erstellen, die Ihre Subversion-Commit-Autorennamen Git-Commitern zuordnet, sagen wir ~/authors.txt:

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

Dann 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 auf einem Mac sind, können Sie bekommen git-svn von MacPorts durch Installieren git-core +svn.

Wenn sich Ihr Subversion-Repository auf demselben Computer wie Ihr gewünschtes Git-Repository befindet, dann kannst du diese Syntax für den init-Schritt verwenden, ansonsten egal:

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

183
2017-09-21 02:15



Ich habe das svn2git-Skript benutzt und funktioniert wie ein Zauber! https://github.com/nirvdrum/svn2git


67
2017-09-26 13:13



Ich schlage vor, mit Git vertraut zu werden, bevor ich versuche, git-svn ständig zu verwenden, d.h. SVN als zentralisiertes Repo zu behalten und Git lokal zu verwenden.

Für eine einfache Migration mit der gesamten Historie folgen jedoch die folgenden einfachen Schritte:

Initialisieren Sie das lokale Repo:

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

Markiere, wie weit du mit dem Import von Revisionen beginnen möchtest:

git svn fetch -r42

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

Holen Sie eigentlich alles seither ab:

git svn rebase

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

gitk

Wenn Sie Ihren SVN Repo lokal geklont haben, können Sie ihn für eine einfachere Zusammenarbeit in ein zentralisiertes Git Repo verschieben.

Erstellen Sie zuerst Ihr leeres Remote Repo (vielleicht auf GitHub?):

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

Synchronisieren Sie dann optional Ihren Hauptzweig, damit der Pull-Vorgang den Remote-Master automatisch mit Ihrem lokalen Master zusammenführt, wenn beide neue Inhalte enthalten:

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

Danach könntest du vielleicht mein eigenes ausprobieren git_remote_branch Werkzeug, das den Umgang mit entfernten Niederlassungen erleichtert:

Erster Erklärungsbeitrag: "Git Remote-Filialen"

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


56



Es gibt eine neue Lösung für eine reibungslose Migration von Subversion zu Git (oder für die gleichzeitige Verwendung beider): SubGit (http://subgit.com/).

Ich arbeite selbst an diesem Projekt. Wir verwenden SubGit in unseren Repositories - einige meiner Teamkollegen verwenden Git und etwas Subversion und bisher funktioniert es sehr gut.

Um mit SubGit von Subversion nach Git zu migrieren, müssen Sie Folgendes ausführen:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Danach erhalten Sie das Git-Repository in svn_repos / .git und können es klonen oder einfach weiter Subversion und dieses neue Git-Repository zusammen verwenden: SubGit stellt sicher, dass beide immer synchron bleiben.

Wenn Ihr Subversion-Repository mehrere Projekte enthält, werden mehrere Git-Repositories im Verzeichnis svn_repos / git erstellt. Um die Übersetzung anzupassen, bevor Sie sie ausführen, gehen Sie folgendermaßen vor:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

Mit SubGit Sie können zu reinem Git (nicht git-svn) migrieren und damit beginnen, Subversion so lange zu verwenden, wie Sie es benötigen (zum Beispiel für Ihre bereits konfigurierten Build-Tools).

Hoffe das hilft!


29



Siehe den Beamten git-svn manpage. Schauen Sie sich insbesondere unter "Basisbeispiele" an:

Verfolgen und Beitrag zu einem gesamten von Subversion verwalteten Projekt (komplett       mit einem Stamm, Tags und Zweigen):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

16



Pro Git 8.2 erklärt es: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git


14