2016-11-04 1 views
1

Meine SVN-Struktur ist wie folgt:Wie git ein SVN-Repository klonen, in dem sich alle Zweige in root befinden?

/ 
|-- Branch1 
|-- Branch2 
|-- Branch3 
... 

Wie kann ich dies in einem Git-Repository klonen die Zweige (das heißt nicht flach Geschichte) zu bewahren?

Bonusfrage: Wie klonst nur eine Teilmenge der SVN-Zweige in ein neues Git-Repository?

+0

Geht es um eine einmalige Konvertierung von SVN nach Git und dann wird nur Git benutzt, oder wollen Sie von Git auf SVN zurückkommen? – Vampire

+0

Es ist eine einmalige Konvertierung, aber ich würde gerne in der Lage sein, neuere SVN-Commits an meinen Git-Repo weiterzuleiten. – user1709708

Antwort

0

Ich glaube, dass in SVN Filialen nur Ordner sind, ist es nur eine Konvention. Git arbeitet tatsächlich mit Zweigen. Damit wird der Ansatz einfacher.

Da Sie die Daten aus dem SVN-Repository abrufen müssen, müssen Sie dafür Remote erstellen. Aus der Struktur sehe ich, dass Sie Branch 1 bis 3 in Ihrem Git-Repository erstellen müssen.

Erstellen Sie Git-Repository.

git init 
git config --local --add user.name <Username> 
git config --local --add user.email <email> 
echo "MASTER" > master 
git add master 
git commit -m "Dummy commit" 

Erstellen Sie Remote von Ihrem SVN-Zweig.

git config --add svn-remote.<BranchName>.url <SVN URL> 
git config --add svn-remote.<BranchName>.fetch :refs/remotes/<RemoteName> 

für Branch1:

git config --add svn-remote.branch1.url https://svnhost/svn/MyRepo/Branch1 
git config --add svn-remote.branch1.fetch :refs/remotes/branch1_remote 

Fetch SVN Daten branch1:

git svn fetch branch1 

Wiederholen dieses für andere beiden Zweige Branch2 und Branch3.

Sie können hier anhalten, wenn Sie nur versuchen zu klonen. Sie müssen nicht weiter fortfahren, es sei denn, Sie möchten mit dem Git-Repository arbeiten. Google auf git subtree, um zu wissen, warum dies in Ihrem Fall die richtige Lösung sein könnte.

Subtree zu erstellen:

Find last commit id: 
git checkout remotes/branch1_remote 
git svn log -n 1 --show-commit --oneline 
Output: 734713bc047d87bf7eac9674765ae793478c50d3 (This is yout LastCommitId value) 

Create subtree in mainline master branch: 
git checkout master 
git subtree add --prefix=Branch1 <LastCommitId> 

Für Sie Bonus-Frage: Versuchen Sie, diese

git svn clone https://svnhost/svn/MyRepo/Branch2 

Dieses einfach ist, ist der andere Weg, um die obigen Schritte zu folgen und stattdessen drei Fernbedienungen zu schaffen, in Das gleiche Repository erstellt jedes Mal ein neues Repository und fügt dann die Remote-Adresse Ihrer Filiale hinzu. Basierend auf Ihrer Anforderung können Sie verschiedene Wege googlen.

0

Klonen Sie nur die ersten paar Revisionen von nur Stamm, bevor irgendwelche Zweige erstellt wurden. Ich nehme an, dass Ihre Zweige nicht vor Revision 5 erstellt wurden. Ich nehme auch an, dass Ihr Stammordner den Namen trunk hat. Dementsprechend anpassen. Hoffentlich haben Sie bereits eine Autoren-Datei erstellt. Dadurch wird das lokale Repository eingerichtet.

$ git svn clone https://svn.example.com/myrepo --authors-file=authors.txt -T trunk -r 1:5 myrepo 

Als Nächstes fügen branches Linien in myrepo/.git/config ähnlich wie diese:

[svn-remote "svn"] 
    url = https://svn.example.com/myrepo 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/Branch1:refs/remotes/origin/* 
    branches = branches/Branch2:refs/remotes/origin/* 
    branches = branches/Branch3:refs/remotes/origin/* 

Wenn Ihre Zweige eine Namenskonvention folgen, die mit einem Muster wie in Ihrem Beispiel angepasst werden kann, können Sie dies tun:

[svn-remote "svn"] 
    url = https://svn.example.com/myrepo 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/Branch*:refs/remotes/origin/* 

Einige Leute empfehlen, myrepo/.git/svn/.metadata zu löschen, nachdem Sie diese Änderungen vorgenommen haben. Ich weiß nicht, ob das nötig ist oder nicht.

Jetzt holen Sie nur die restlichen Revisionen. Git svn wird die Struktur der Filiale erarbeiten und das Richtige tun. Alle Zweige, die nicht mit einer der Zeilen branches übereinstimmen, werden ignoriert.

$ cd myrepo 
$ git svn fetch 

Sobald es abgeschlossen ist, können Sie überprüfen, dass die Zweige mit diesem Befehl erstellt wurden.