SVN Unterverzeichnis von einem Repository in ein neues verschiebenSVN HowTo move subdirectory from one repository to another

Schon länger arbeite ich an einem C++ Projekt, das ich in meinem allgemeinen C++-Repository als Unterverzeichnis eingecheckt hatte. Jetzt hab ich mir eingebildet, dass ich das Projekt in einem eigenen SVN-Repository verwalten möchte. Doch wie? Google hilft natürlich ..

For some time now I’m working on a C++ project, committing my changes to my common C++ repository as a subdirectory. Today I had the idea to have a own SVN repository for this project. Doing some Google search showed me the way ..

Nehmen wir an man hat ein Repository das folgendermassen aufgebaut ist:

/var/svn-repos/cpp

* dir1

* dir2

und man möchte nun dir2 in das neue Repository unter

/var/svn-repos/Project1

verschieben. Gar kein Problem mit svnadmin. Als erstes legt man wie gewohnt das neue SVN-Directory an:

svnadmin create –fs-type fsfs /var/svn-repos/Project1

Danach kommt das eigentliche Verschieben. Zuerst dumpen, danach einlesen.

Dump des alten Repository erstellen:

svnadmin dump /var/svn-repos/cpp/ | svndumpfilter include \

–drop-empty-revs –renumber-revs /dir2 > Project1.svndump

Mit svnadmin verwaltet man die SVN-Repositorys am Server. Die Option dump gibt den gesamten Inhalt des Repositorys, auch die Versionierungshistory, in einem speziellen Dump-Format aus. svndumpfilter filtert das Dump-File bei der Ausgabe nach verschiedenen Kriterien. In diesem speziellen Fall werden durch die Option include alle Knoten die nicht spezifiziert sind aus dem Dump-Datenstrom herausgefiltert, wodurch nur der gewünschte Inhalt im Dump-File ankommt. Mit der Option –drop-empty-revs werden alle, durch den Filter ignorierten, leeren Revisioneinträge ingnoriert, die Option –renumber-revs numeriert die noch vorhanden Revisions neu.

Zum Abschluss muss der SVN-Dump noch in das neue Repository eingelesen werden. Dies geschieht erneut mittels svnadmin:

svnadmin load /var/svn-repos/Project1 < Project1.svndump

Fertig.


Imagine there is a repository which looks like the following:

/var/svn-repos/cpp
* dir1
* dir2

and dir2 should now be migrated to a new, own repository like

/var/svn-repos/Project1

This is quite easy using svnadmin. First of all we create the new repository:

svnadmin create –fs-type fsfs /var/svn-repos/Project1

Now the moving. First dumping then reloading.

Dump of the old repository data:

svnadmin dump /var/svn-repos/cpp/ | svndumpfilter include \
–drop-empty-revs –renumber-revs /dir2 > Project1.svndump

svnadmin is the main administration tool for SVN repositories. Option dump dumps out the complete content of the repository, including the history, using a specific dump-format. svndumpfilter filters the dump stream regarding to the specified criterias. Using option include drops out everything which was not defined from the dump stream – only requested data gets into the dump file. With option –drop-empty-revs every dropped and therefor empty revisions are ignored, –renumber-revs renumbers all revisions which are still dumped out.

Finally the dump must be loaded into the new repository using svnadmin again:

svnadmin load /var/svn-repos/Project1 < Project1.svndump

Finished.

1 thought on SVN Unterverzeichnis von einem Repository in ein neues verschiebenSVN HowTo move subdirectory from one repository to another

  1. Sehr hilfreich, vielen Dank. Die Optionen bei svndumpfilter mussten bei mir mit zwei “–” versehen werden:

    svndumpfilter include -–drop-empty-revs -–renumber-revs …

    Außerdem wird der komplette Pfad innerhalb des Repositories ins Dump übernommen (z.B. “/trunk/dir1/datei.cpp” und ich musste noch “/trunk” von hand anlegen, sonst kam es zu einer Fehlermeldung bei “svadmin load …”

    svn mkdir /path/to/new/repo/trunk

    bzw.

    svn mkdir https://svn.new.repo.url/trunk

    Praktisch wäre es, wenn man den Pfad gleich im Dumpfile los würde. Aber svndumpfilter bietet hier wohl keine Option. Hat jemand eine Idee dazu?

Leave a Reply

Your email address will not be published. Required fields are marked *