Frage

Ich las den Git Handbuch, FAQ, Git - SVN Crash-Kurs etc. und sie alle erklären dies und das, aber nirgendwo können Sie eine einfache Anweisung wie finden:

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 einfach zu sein, und ich erwarte nicht, es ist ein einziger Befehl sein. Aber ich erwarte, dass es nicht zu versuchen, etwas zu erklären, -. Nur zu sagen, was in diesem Beispiel gegeben Schritte zu ergreifen

War es hilfreich?

Lösung

Magic:

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

Git und SVN arbeiten sehr unterschiedlich. Sie müssen Git lernen, und wenn Sie möchten Upstream-Änderungen von SVN verfolgen, müssen Sie git-svn lernen. Die git-svn Manpage hat einen gutes Beispiele Abschnitt:

$ git svn --help

Andere Tipps

Erstellen Sie eine Benutzer-Datei (das heißt users.txt) für die Zuordnung von SVN Benutzer Git:

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

Sie können diese Einzeiler verwenden eine Vorlage aus Ihrer vorhandenen SVN-Repository zu erstellen:

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

SVN stoppt, wenn es einen fehlenden SVN Benutzer nicht in der Datei findet. Aber danach können Sie die Datei aktualisieren und Pick-up, wo Sie aufgehört haben.

Sie nun die SVN-Daten aus dem Repository ziehen:

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

Mit diesem Befehl wird eine neue Git-Repository in dest_dir-tmp erstellen und starten Sie die SVN-Repository zu ziehen. Beachten Sie, dass die "--stdlayout" Flagge bedeutet, dass Sie die gemeinsame "trunk /, branches /, tags /" haben SVN-Layout. Wenn Ihr Layout unterscheidet, wird vertraut mit --tags, --branches, --trunk Optionen (im allgemeinen git svn help).

Alle gängigen Protokolle sind erlaubt: svn://, http://, https://. Die URL sollte die Basis-Repository Ziel, so etwas wie http://svn.mycompany.com/myrepo/repository. Das muss nicht sind /trunk, /tag oder /branches.

Beachten Sie, dass Sie diesen Befehl nach der Ausführung sieht es sehr oft wie die Operation „hanging / fror“, und es ist ganz normal, dass es für eine lange Zeit stecken werden kann, nachdem das neue Repository zu initialisieren. siehe Schließlich werden Sie dann Log-Meldungen, die anzeigt, dass es zu migrieren.

Beachten Sie auch, dass, wenn Sie die --no-metadata Flag weglassen, Git Informationen über die entsprechenden SVN Revision der Commit-Nachricht anhängen wird (das heißt 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

Sie haben könnten, dass im letzten Befehl mehrmals wiederholen, wenn Sie ein großes Projekt haben, bis alle der Subversion Commits geholt wurden:

git svn fetch

Wenn Sie fertig sind, Git das SVN trunk in einen neuen Zweig der Kasse. Alle anderen Zweige sind Setup als Fernbedienungen. Sie können den anderen SVN-Zweig mit Aussicht:

git branch -r
manuell

Wenn Sie andere Remote-Niederlassungen in Ihrem Repository halten wollen, möchten Sie eine lokale Niederlassung für jeden zu schaffen. (Stamm / Master überspringen.) Wenn Sie dies nicht tun, werden die Zweige nicht im letzten Schritt geklont erhalten.

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

Die Tags werden als Zweige importiert. Sie haben einen lokalen Zweig zu erstellen, um einen Tag zu machen und den Zweig löschen als Tags in Git zu haben. Um es zu tun mit dem Tag "v1":

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

klont GIT-SVN-Repository in eine saubere Git-Repository:

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

Die lokalen Niederlassungen, die Sie zuvor von entfernten Filialen erstellt haben wird nur als Remote-Filialen in das neue geklonte Repository kopiert. (Überspringen Stamm / Master). Für jeden Zweig Sie behalten möchten:

git checkout -b local_branch origin/remote_branch

Schließlich die Fernbedienung von Ihrem sauberen Git-Repository entfernen, die auf die nun gelöscht temporären Repository-Punkten:

git remote rm origin

Cleanly migrieren Sie Ihre Subversion-Repository zu einem Git Repository . Zuerst müssen Sie eine Datei erstellen, die Karten Ihre Subversion Autorennamen zu Git Committer begehen, sagen ~/authors.txt:

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

Dann können Sie die Subversion-Daten in eine Git-Repository heruntergeladen werden:

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 git-svn von MacPorts durch die Installation git-core +svn erhalten.

Wenn Ihr Subversion-Repository auf der gleichen Maschine wie die gewünschte git-Repository ist, dann können Sie diese Syntax für den init Schritt verwenden, sonst alle gleich:

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

Ich benutzte die svn2git Skript und wirkt wie ein Zauber.

Ich schlage vor, sich mit Git vor git-svn ständig zu verwenden versuchen, das heißt SVN als zentrale Repo zu halten und mit Git lokal.

Doch für eine einfache Migration mit der ganzen Geschichte, hier sind die wenigen einfachen Schritten:

Initialisieren der lokalen Repo:

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

Mark, wie weit zurück Sie starten möchten Revisionen importieren:

git svn fetch -r42

(oder nur "git svn holen" für alle Drehzahlen)

Eigentlich alles holen, da dann:

git svn rebase

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

gitk

Wenn Sie Ihr SVN Repo geklont lokal haben, möchten Sie vielleicht, es zu einem zentralen Git-Repo schieben für einfachere Zusammenarbeit.

Sie zunächst Ihre leere Remote-Repo erstellen (vielleicht auf GitHub ?):

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

Dann optional Ihren Hauptzweig synchronisieren, so wird der Zugbetrieb automatisch den Remote-Master mit Ihrem lokalen Master fusionieren, wenn beide neue Slideshows enthalten:

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

Danach können Sie interessiert sein mein eigenes git_remote_branch Werkzeug beim Versuch, das mit Remote-Niederlassungen Umgang hilft:

Ersten Erklärungs Beitrag: " Git entfernte Niederlassungen "

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

Es gibt eine neue Lösung für die reibungslose Migration von Subversion zu Git (oder für die Verwendung beide gleichzeitig): SubGit .

Ich arbeite an diesem Projekt selbst. Wir verwenden SubGit in unseren Repositories - einige meiner Mitspieler verwenden Git und einige Subversion und so weit es funktioniert sehr gut

.

von Subversion migrieren mit SubGit Git Sie ausführen müssen:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Danach werden Sie Git-Repository in svn_repos / .git bekommen und kann es klonen, oder einfach nur weiter Subversion und diese neue Git Repository verwenden zusammen: SubGit wird sicherstellen, dass beide immer synchron gehalten.

Wenn Ihre Subversion-Repository enthält mehrere Projekte, dann mehrere Git-Repositories werden in svn_repos / git-Verzeichnis erstellt werden. So passen Übersetzung, bevor es die folgenden Schritte aus ausgeführt werden:

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

Mit SubGit zu reinem Git migrieren kann (nicht git-svn) und starten Sie es, während immer noch Subversion zu halten so lange, wie Sie es brauchen (für Ihre bereits konfigurierten Build-Tools, zum Beispiel).

Hope, das hilft!

Sehen Sie die offizielle git-svn manpage . Insbesondere suchen Sie unter „Basic-Beispiele“:

  

Tracking und ein Beitrag zu einem gesamten Subversion-Managed-Projekt (komplett       mit einem Stamm, Tags und Zweige):

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

SubGit (vs Blue Screen of Death)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Es ist alles.

+ Um von SVN zu aktualisieren, eine Git-Repository durch den ersten Befehl erstellt.

subgit import  directory/path/Local.git.Repo

habe ich eine Art und Weise sofort für ein großes Repository Git zu migrieren.
Natürlich müssen Sie einige Vorbereitungen.
Sie können aber stoppen Entwicklungsprozess nicht, überhaupt nicht.

Hier ist meine Art und Weise.

Meine Lösung sieht so aus:

  • Migrate SVN zu einer Git-Repository
  • Aktualisieren Sie den Git-Repository kurz vor Teams Umschaltung auf .

Migration dauert für eine große SVN-Repository viel Zeit.
Aber die Aktualisierung der fertig gestellte Migration nur wenige Sekunden.

Natürlich bin ich mit SubGit , Mama. git-svn macht mich Blue Screen of Death . Nur ständig. Und git-svn bohrt mich mit Git „ Dateinamen zu lang “schwerwiegende Fehler.

STEPS

1. Herunterladen SubGit

2. Bereiten Sie migrieren und aktualisieren Befehle.

Nehmen wir an, wir tun es für Windows (es ist trivial zu portieren zu Linux).
In einem Installation des SubGit ist Verzeichnis (subgit-2.X.X \ ist), erstellen Sie zwei .bat-Dateien.

Inhalt einer Datei / Befehl für die Migration:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Der Befehl "Start" optional ist hier (Windows). Es wird erlauben, Fehler beim Start zu sehen, und eine Schale nach der Beendigung der SubGit geöffnet gelassen.

Sie können hier hinzufügen zusätzliche Parameter ähnlich wie git-svn . Ich verwende nur - default-Domain myCompanyDomain.com die Domäne der E-Mail-Adresse der SVN Autoren zu beheben.
Ich habe die Standardstruktur der SVN-Repository (trunk / branches / tags) und wir hatten keine Probleme mit „Autoren-Mapping“. Also nichts, was ich mache mehr.

(Wenn Sie Tags wie Zweige oder Ihre SVN haben mehrere Zweige migrierenden / tags Ordner Sie die ausführlichere SubGit Ansatz )

Tipp 1 : Verwenden Sie --minimal-Revision YourSvnRevNumber schnell, um zu sehen, wie die Dinge kochen aus (eine Art von Debugging). Besonders nützlich ist aufgelöst Autorennamen oder E-Mails zu sehen.
Oder die Migrationsgeschichte Tiefe zu begrenzen.

Tipp 2 : Migration unterbrochen sein kann ( Strg + C ) und wieder von der nächsten Aktualisierung Befehl / Datei ausgeführt wird.
Ich rate nicht dies für große Repositories zu tun. Ich habe "nicht genügend Arbeitsspeicher Java + Windows-Ausnahme" erhalten hat.

Tipp 3 :. Besser eine Kopie Ihrer Ergebnis nackten Repository erstellen

Inhalt einer Datei / Befehl für die Aktualisierung:

start    subgit import  directory/path/Local.git.Repo

Sie können es jede Menge Zeit ausgeführt, wenn Sie die letzten Teams Commits zu Ihrem Git Repository erhalten möchten.

Achtung! bloße Repository (Schaffung von Zweigen zum Beispiel) nicht berühren.
Sie werden die nächsten fatalen Fehler nehmen:

  

Nicht behebbarer Fehler: nicht synchron sind und nicht synchronisiert werden kann ... Übersetzen Subversion Revisionen Git verpflichtet ...

3. Führen Sie die ersten Befehl / Datei. Es wird benötigt sehr viel Zeit für ein großes Repository nehmen. 30 Stunden für meine bescheidene Repository.

Es ist alles.
Sie können Ihre Git-Repository von SVN jederzeit beliebig viel Zeit, indem Sie die zweite Datei / Befehl aktualisieren. Und vor dem Gi Ihres Entwicklungsteams Schaltt.
Es wird nur Sekunden dauern.



Es gibt eine weitere nützliche Aufgabe.

Schieben Sie Ihre lokale Git-Repository zu einer Remote-Git-Repository

Ist es Ihr Fall? Lassen Sie uns gehen.

  1. Konfigurieren Sie Ihre Fernbedienungen

Ausführen:

$ git remote add origin url://your/repo.git
  1. Bereiten Sie senden Ihre großen lokalen Git-Repository zu einer Remote-Repository paraphieren

Standardmäßig Git können große Stücke nicht senden. fatal: Das entfernte Ende hing unerwartet

Lassen Sie uns für sie laufen:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 -. 1 GB, etc

Fix Ihre lokalen Zertifikat Probleme . Wenn Ihr git-Server verwendet ein gebrochenes Zertifikat.

Ich habe deaktiviert Zertifikate .

Auch Ihr Git-Server kann eine Anfrage Menge Einschränkungen benötigen korrigiert werden .

  1. alle Migration Drücken das Remote-Git-Repository-Team.

Ausführen mit einem lokalen Git:

git push origin --mirror

( git push origin '*: *' für alte Git-Versionen)

Wenn Sie die folgenden: Fehler: kann nicht git laichen: Keine solche Datei oder das Verzeichnis ... Für mich ist die vollständige Erholung von meinem Repository diesen Fehler behebt (30 Stunden). Sie können die nächsten Befehle versuchen

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

oder versuchen, Git ( nutzlos Neuinstallation für me ). Oder können Sie Zweige erstellen aus allen von Tags und schieben Sie sie. Oder, oder, oder ...

reposurgeon

Bei komplizierten Fällen reposurgeon von Eric S. Raymond das Werkzeug der Wahl ist. Neben SVN unterstützt es viele andere Versionskontrollsysteme über das fast-export-Format und auch CVS . Der Autor berichtet erfolgreiche Umsetzungen von alten Repositorys wie Emacs und FreeBSD .

Das Tool offenbar zielt auf nahezu perfekte Umwandlung (wie zum Beispiel der Umwandlung SVN des svn:ignore Eigenschaften .gitignore Dateien) auch für schwieriges Repository-Layout mit einer langen Geschichte. Für viele Fälle, andere Werkzeuge könnten einfacher sein, zu verwenden.

Vor der in der Dokumentation der reposurgeon Kommandozeile eintauchen, müssen Sie die ausgezeichnete DVCS Migrationsleitfaden , die den Umwandlungsprozess Schritt für Schritt übergeht.

Dieses Handbuch auf atlassian Webseite ist eine der besten, die ich gefunden habe:

https://www.atlassian.com/git/migration

Dieses Tool - https://bitbucket.org/atlassian/svn-migration-scripts - ist auch wirklich nützlich für Ihre authors.txt unter anderem Erzeugung

.

Sie müssen installieren

git
git-svn

von diesem Link kopiert http://john.albin.net/git/ convert-Subversion-to-git .

1. Rufen Sie eine Liste aller Subversion-Committer

Subversion listet einfach den Benutzernamen für jede begehen. Git Commits haben viel reiche Daten, aber am einfachsten, der Autor muss begehen aufgelistet einen Namen und eine E-Mail haben. Standardmäßig Liste der git-svn-Tool wird nur die SVN-Benutzernamen in den beiden Autor und E-Mail-Felder. Aber mit ein wenig Arbeit können Sie eine Liste aller SVN Benutzer erstellen und was ihre entsprechenden Git Namen und E-Mails sind. Diese Liste kann durch git-svn zu transformieren Ebene SVN Benutzernamen in die richtige Git Committer verwendet werden.

Von der Wurzel Ihres lokalen Subversion-Checkout, führen Sie diesen Befehl ein:

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

Das wird alle Log-Meldungen packen, die Benutzernamen auszureißen, beseitigen alle doppelten Benutzernamen, die Benutzernamen sortieren und sie in eine „Autoren-transform.txt“ Datei platzieren. Jetzt jede Zeile in der Datei bearbeiten. Zum Beispiel konvertieren:

jwilkins = jwilkins <jwilkins>

in diesen:

jwilkins = John Albin Wilkins <johnalbin@example.com>

2. Klonen Sie die Subversion-Repository mit git-svn

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Dies wird die Standard-git-svn Transformation tun (mit den Autoren-transform.txt Datei, die Sie in Schritt 1 erstellt hat) und legen Sie die git-Repository in den „~ / temp“ Ordnern in Ihrem Home-Verzeichnis.

3. Konvertieren Sie svn: ignore Eigenschaften .gitignore

Wenn Ihr SVN-Repo mit svn war: ignore Eigenschaften, können Sie einfach diese konvertieren zu einer .gitignore Datei mit:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. Push-Repository zu einer bloßen git-Repository

Zuerst mit einem nackten Repository erstellen und seinen Standardzweig Spiel svn die „Stamm“ Zweignamen machen.

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

Dann drücken Sie das Temp-Repository in die neuen Bare-Repository.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

Sie können jetzt sicher löschen Sie die ~ / temp-Repository.

5. Umbenennen „Stamm“ Zweig „Master“

Ihr Hauptentwicklungszweig wird genannt „Stamm“, die den Namen paßt es in Subversion war. Sie werden es zu Git Standard „Master“ Zweig umbenennen möchten, mit:

cd ~/new-bare.git
git branch -m trunk master

6. Bereinigen Branches und Tags

git-svn macht alle Subversionen Tags in sehr kurzen Niederlassungen in Git der Form „Tags / name“. Sie wollen alle diese Zweige in tatsächliche Git-Tags konvertieren mit:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

Mit diesem Schritt wird ein bisschen Typisierung nehmen. :-) Aber, keine Sorge; Ihre Unix-Shell eine> sekundäre Eingabeaufforderung für den extra langen Befehl liefern, die für-jeden-ref mit git beginnt.

GitHub hat jetzt eine Funktion Import aus einem SVN-Repository . Ich versuchte es nie, aber.

Eine etwas längere Antwort mit nur git, SVN und bash. Es enthält Schritte für SVN-Repositories, die das herkömmliche Layout nicht mit einem trunk / branches / tags Verzeichnislayout verwenden (SVN absolut nichts tut diese Art von Layout zu erzwingen).

Zuerst diesen Bash-Skript verwenden, um Ihre SVN-Repo für die verschiedenen Menschen zu scannen, die dazu beigetragen und eine Vorlage für eine Zuordnungsdatei zu generieren:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

Verwenden Sie diese eine authors-Datei zu erstellen, wo Sie svn Benutzernamen Benutzernamen und E-Mail-Karte, wie von Ihrem Entwickler setzen mit git config Eigenschaften user.name und user.email (beachten Sie, dass für einen Dienst wie GitHub nur eine passende E-Mail mit reicht).

Dann haben git svn klonen die svn Repository in ein Git Repository, es geht um die Zuordnung zu sagen:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Das kann unglaublich lange dauern, da git svn individuell für jeden Tag jede Revision auschecken oder Zweig, der existiert. (Beachten Sie, dass Tags im SVN sind nur wirklich Zweige, so dass sie am Ende als solche in Git). Sie können dies durch das Entfernen alten Tags und Zweige in SVN beschleunigen Sie nicht brauchen.

diese im selben Netzwerk auf einen Server ausgeführt werden oder auf demselben Server kann dies auch wirklich beschleunigen. Auch wenn aus irgendeinem Grund dieser Vorgang unterbrochen wird Sie können fortsetzen es mit

git svn rebase --continue

In vielen Fällen Sie hier fertig sind. Aber wenn Ihr SVN Repo hat eine unkonventionelle Layout, in dem man einfach ein Verzeichnis in SVN haben Sie in einem Git-Zweig setzen möchten, können Sie einige zusätzliche Schritte tun.

Die einfachste ist, einfach eine neue SVN-Repo auf dem Server zu machen, die Konvention nicht folgen und svn copy Ihr Verzeichnis in Stamm setzen oder einem Zweig. Dies könnte der einzige Weg sein, wenn Ihr Verzeichnis den ganzen Weg an der Wurzel des Repo ist, wenn ich diese git svn zuletzt versucht, einfach weigerte sich, eine Kasse zu tun.

Sie können auch diese mit Git tun. Für git svn clone verwenden Sie einfach das Verzeichnis möchten Sie in einem git Zweig setzen.

Nach dem Lauf

git branch --set-upstream master git-svn
git svn rebase

Beachten Sie, dass dies erforderlich Git 1.7 oder höher.

Ich habe einen Schritt für Schritt Anleitung geschrieben ( hier ) sVN in git einschließlich Umwandlung sVN-Tags in git-Tags und svn Filialen in git Zweige zu konvertieren.

Kurzversion:

1) Klon von einer bestimmten Versionsnummer Svn. (Die Revisionsnummer muss der älteste Sie migrieren möchten)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) holen svn Daten. Dieser Schritt ist es das man es am meisten Zeit in Anspruch nimmt.

cd gitreponame
git svn fetch

Wiederholung git svn bis beendet, ohne Fehler holen

3) erhalten Master-Zweig aktualisiert

git svn rebase

4) Erstellen Ortsvereine aus dem SVN Zweig durch Referenzen Kopieren

cp .git/refs/remotes/origin/* .git/refs/heads/

5) konvertieren SVN-Tags in git-Tags

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Setzen Sie ein Repository zu einem besseren Ort wie Github

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

Wenn Sie weitere Informationen wünschen, lesen Sie meine Post oder fragen Sie mich.

Wir verwenden git svn clone wie unten Befehle.

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

Vor Befehlen erstellen Autoren aus dem SVN-Datei verpflichtet.

  • svn log --stop-on-copy <SVN_URL>

Vor Befehl gibt Ihnen erste Revisionsnummer, wenn Ihr SVN-Projekt erstellt wurde.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

Vor Befehl wird die Git-Repository in lokalen erstellen.

Das Problem ist, dass es nicht konvertieren Zweige und Tags zu schieben. Sie müssen sie manuell tun. Zum Beispiel unten Zweige:

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

Für tags:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

Drücken Sie nun Master, Zweige und Tags zu entfernten Git Repository.

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

svn2git Dienstprogramm

svn2git Dienstprogramm entfernt manuellen Aufwand mit Branches und Tags.

Installieren Sie Befehl sudo gem install svn2git verwenden. Danach unter Befehl ausführen.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Jetzt können Sie die Zweige, Tags Liste und drücken Sie sie leicht.

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

Stellen Sie sich vor Sie haben 20 Zweige und Tags, offensichtlich wird svn2git Sie viel Zeit sparen und das ist, warum ich es besser gefällt als das native Befehle. Es ist eine nette Wrapper um nativer git svn clone Befehl.

Ein vollständiges Beispiel finden Sie meinen Blog-Eintrag .

TortoiseGit tut dies. finden Sie in diesem Blog-Post: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

Ja, ich mit Links wissen zu beantworten ist nicht prächtig, aber es ist eine Lösung, nicht wahr?

ich dieses ich gerade entdeckt. Der Autor führt Sie durch die grundlegenden Operationen, und zeigt einige erweiterte Nutzungen.

Wenn Sie SourceTree verwenden Sie können diese direkt aus der App tun. Gehe zu Datei -> Neu / Clone dann wie folgt vor:

  1. Geben Sie die Remote-SVN-URL als "Quellpfad / URL".
  2. Geben Sie Ihre Anmeldeinformationen, wenn Sie dazu aufgefordert.
  3. Geben Sie den lokalen Ordner als „Zielpfad“.
  4. Geben Sie ihm einen Namen.
  5. In den erweiterten Optionen wählen „Git“ aus der Drop-Down-in „Erstellen lokale Repository vom Typ“.
  6. Sie können optional eine Revision angeben zu klonen aus.
  7. Hit Clone.

in SourceTree den Repo öffnen und Sie werden sehen, haben Ihre Commit-Nachrichten zu migriert.

Jetzt Repository gehen -> Repository-Einstellungen und fügen Sie die neue Remote-Repo-Details. Löschen Sie die SVN-Fernbedienung, wenn Sie es wünschen (Ich tat dies durch die „Edit Config File“ aus.

Drücken Sie den Code in das neue Remote-Repo, wenn Sie bereit sind, und Code frei.

Gitlab Benutzer ich auf einen Kern aufgestellt haben, wie ich aus dem SVN migriert hier:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

Nur wenige Schritte von SVN zu Gitlab

zu migrieren

Setup

  • SVN bei svn.domain.com.au gehostet werden.
  • SVN über http zugänglich ist (andere Protokolle funktionieren sollte).
  • Gitlab bei git.domain.com.au gehostet und:
    • Eine Gruppe mit dem Namespace dev-team erstellt wird.
    • Mindestens ein Benutzerkonto angelegt wird, hinzugefügt, um die Gruppe, und wird für die Migration (Test mit ssh git@git.domain.com.au) verwendet, um einen SSH-Schlüssel für das Konto zu werden.
    • Das Projekt favourite-project wird im dev-team Namespace erstellt.
  • Die Datei users.txt enthält die relevanten Benutzerdaten, einen Benutzer pro Zeile, von der Form username = First Last <address@domain.com.au>, wo username der Benutzername in SVN logs gegeben ist. (Siehe erstes Glied in Referenzen für weitere Einzelheiten, insbesondere Antwort vom Benutzer Casey).

Versionen

  • Subversion Version 1.6.17 (r1128011)
  • git Version 1.9.1
  • Gitlab Version 7.2.1 ff1633f
  • Ubuntu Server 14.04

Befehle

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

Das ist es! Laden Sie die Projektseite in Gitlab Web-UI und Sie werden alle Commits und Dateien sehen nun aufgelistet.

Notizen

  • Wenn es unbekannte Benutzer, wird der git svn clone Befehl stoppen, wobei in diesem Fall, zu aktualisieren users.txt, cd favourite-project und git svn fetch werden auch weiterhin von dort gestoppt.
  • Das Standard-trunk-tags-branches Layout für SVN-Repository ist nicht erforderlich.
  • Die URL SVN zum git svn clone Befehl gegeben stoppt auf der Ebene unmittelbar über trunk/, tags/ und branches/.
  • Die git svn clone Befehl produziert eine Menge von Ausgabe, darunter auch einige Warnungen an der Spitze; Ich ignorierte die Warnungen.

Als eine andere Seite, die git-Stash-Befehl ist ein Geschenk des Himmels, wenn man versucht mit git-svn dcommits git.

Ein typischer Prozess:

  1. set up git Repo
  2. Sie einige Arbeit auf verschiedene Dateien
  3. entscheiden, einen Teil der Arbeit zu lesen, mit git
  4. entscheiden svn-dcommit
  5. erhält die gefürchteten Fehler „nicht mit einem schmutzigen Index begehen“.

Die Lösung (erfordert git 1.5.3+):

git stash; git svn dcommit ; git stash apply

Hier ist ein einfacher Shell-Skript ohne Abhängigkeiten, die ein oder mehr SVN-Repositories konvertieren git und schieben Sie sie auf GitHub.

https://gist.github.com/NathanSweet/7327535

In etwa 30 Zeilen Skript es: Klone mit git SVN, eine .gitignore Datei aus dem SVN erzeugt :: ignorieren Eigenschaften, schiebt in einem kahlen Git Repository, umbenennt SVN trunk zu meistern, wandelt SVN-Tags-Tags git, und schiebt es GitHub, während die Tags zu erhalten.

Ich ging durch eine Menge Schmerz ein Dutzend SVN-Repositories von Google Code auf GitHub zu bewegen. Es half nicht, dass ich Windows verwendet. Rubin war alle Arten von auf meiner alten Debian-Box gebrochen und ein Witz es funktioniert auf Windows war zu bekommen. Andere Lösungen scheiterten mit Cygwin Pfaden zu arbeiten. Auch wenn ich etwas Arbeits bekam, konnte ich nicht herausfinden, wie die Tags zu erhalten, zeigen sich auf GitHub (das Geheimnis ist --follow-Tags).

Am Ende gepflasterten ich zusammen zwei kurze und einfache Skripte, oben verbunden, und es funktioniert super. Die Lösung braucht nicht mehr als kompliziert zu sein!

Ich bin auf einem Windows-Rechner und machte eine kleine Batch einen SVN Repo mit der Geschichte zu übertragen (aber ohne Verzweigungen) zu einer GIT-Repo nur durch Aufruf

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Vielleicht kann jeder sie verwenden. Es schafft eine TMP-Ordner checkt die SVN-Repo dort mit git und fügt den neuen Ursprung und schiebt ihn ... und löscht den Ordner wieder.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Sie müssen noch die users.txt mit Ihrem Benutzer-Mappings wie

User1 = User One <u.1@xxx.com>

Ich wollte nur meinen Beitrag zur Git Community hinzuzufügen. Ich schrieb einen einfachen Bash-Skript, das den vollständigen Import automatisiert. Im Gegensatz zu anderen Migrationstools, verlässt sich dieses Tool auf nativen git statt JGit. Dieses Tool unterstützt auch Repositories mit einer großen Revision der Geschichte und oder großem Blobs. Es ist erhältlich über Github:

https://github.com/onepremise/SGMS

Dieses Skript Projekte in SVN mit folgendem Format gespeichert konvertieren:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Dieses Schema ist auch sehr beliebt und auch unterstützt:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

wird jedes Projekt von Projektnamen synchronisiert werden über:

Ex: ./migration https://svnurl.com/basepath project1

Wenn Sie über die volle Repo konvertieren, verwenden Sie die folgende Syntax:

Ex: ./migration https://svnurl.com/basepath .

effektiv mit Git mit Subversion ist eine sanfte Einführung in git-svn. Für bestehende SVN-Repositories, git-svn macht diese super einfach. Wenn Sie ein neues Repository fangen, ist es wesentlich einfacher, zuerst eine leere SVN-Repository zu erstellen und importieren Sie dann mit git-svn, als es in der entgegengesetzten Richtung geht. eine neue Git-Repository dann Erstellen in SVN Import getan werden kann, aber es ist ein wenig schmerzhaft, vor allem, wenn Sie neu sind und zu hoffen, dass die Git verpflichten Geschichte zu bewahren.

Laden Sie das Ruby-Installationsprogramm für Windows und die neueste Version mit installieren. In Ruby-ausführbare Dateien auf den Weg.

  • Installieren svn2git
  • Startmenü -> Alle Programme -> Rubin -> Starten Sie eine Eingabeaufforderung mit Ruby-
  • Geben Sie dann „gem install svn2git“ und geben Sie

    Migrieren Subversion-Repository

  • Öffnen Sie eine Eingabeaufforderung Ruby-Befehl und in das Verzeichnis, wo die Dateien sind zu migrierenden

    Dann svn2git http: // [domain name] / svn / [Repository root]

  • Es dauert vielleicht nur wenige Stunden, um das Projekt zu migrieren zu Git auf dem Projektcodegröße abhängig ist.

  • Mit diesem wichtigen Schritt hilft, die Git-Repository-Struktur zu schaffen, wie unten erwähnt.

    SVN (/ Project_components) trunk -> Git-Master SVN (/ Project_components) Filialen -> Git Zweige SVN (/ Project_components) tags -> Git-Tags

, um die Remote-Repository erstellen und die Änderungen drücken.

GitHub hat einen Importeur. Sobald Sie das Repository erstellt haben, können Sie aus einem vorhandenen Repository importieren, über die entsprechende URL. Es wird für Ihre Anmeldeinformationen ggf. fragen und gehen von dort aus.

Wie es läuft es Autoren finden, und Sie können sie für die Nutzer auf GitHub einfach abzubilden.

Ich habe es für ein paar Repositorys jetzt verwendet, und es ist ziemlich genau und viel zu schneller! Es dauerte 10 Minuten, für ein Endlager mit ~ 4000 Commits, und nachdem es meinen Freund 4 Tage nahm!

Mehr Antworten hier finden Sie https://github.com/nirvdrum/svn2git , aber für große Repositorys dies kann langsam sein. Ich hatte einen Versuch mit https://github.com/svn-all-fast-export/ svn2git statt, die ein Werkzeug, mit genau dem gleichen Namen aber wurde verwendet KDE aus dem SVN zu migrieren Git.

Etwas mehr Arbeit um es einzurichten, aber wenn Sie fertig ist die Umwandlung selbst für mich nahm Minuten, wo die anderen Skript Stunden verbracht haben.

Es gibt verschiedene Methoden, um dieses Ziel zu erreichen. Ich habe einige von ihnen versucht und fand wirklich eine Arbeit mit nur git und svn installiert auf Windows-Betriebssystem.

Voraussetzungen:

  1. git auf Windows (ich verwendet habe, diese) https://git-scm.com/
  2. svn mit Konsolentools installiert (ich habe verwendet Schildkröte SVN)
  3. Dump-Datei der SVN-Repository. svnadmin dump /path/to/repository > repo_name.svn_dump

Schritte Endziel zu erreichen (verschieben alle Repository mit der Geschichte zu einem git zunächst lokalen git, dann remote)

  1. Erstellen Sie leere Repository (mit Konsole Tools oder TortoiseSVN) im Verzeichnis REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, setzen dumpfile.dump in REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump für diese Operation zu warten, kann es lange dauern,

  3. Mit diesem Befehl schweigen, so offen zweite cmd Fenster: svnserve -d -R --root REPO_NAME_FOLDER Warum nicht einfach Datei: /// ......? Ursache nächsten Befehls wird fehlschlagen mit Unable to open ... to URL: dank der Antwort https://stackoverflow.com/a/6300968/4953065

  4. neue Ordner SOURCE_GIT_FOLDER erstellen

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn:. // localhost / Warten Sie für diesen Vorgang

Schließlich was wir haben?

Hier können unsere lokalen Repository prüfen:

git log

Ihre vorherigen Commits? Wenn ja - in Ordnung

So, jetzt haben Sie voll funktionsfähig lokalen Git Repository mit Ihren Quellen und alter svn Geschichte. Nun, wenn Sie es auf einem Server verschieben möchten, verwenden Sie die folgenden Befehle ein:

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

In meinem Fall habe ich nicht Tags benötigen Befehl verursacht meine Repo-Tags nicht hat.

Viel Glück!

Konvertieren von Svn Submodul / Ordner 'MyModule' in git mit Geschichte ohne Umbauten noch Zweige.

svn ignorieren Liste, die die obigen Ausführungen nach dem Schritt 1

verwenden, um behalten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top