Wie verschiebe ich einen einzelnen Ordner von einem Subversion-Repository in ein anderes?

156

Ich habe einen "docs" -Ordner in einem Subversion-Repository mit dem Namen "project". Ich bin zu dem Schluss gekommen, dass es wirklich unter einem separaten Subversion-Repository namens "project_docs" aufbewahrt werden sollte.

Ich möchte den Ordner "docs" ( und alle seine Revisionen ) in das Repository "project_docs" verschieben. Gibt es eine Möglichkeit, dies zu tun?

linkes Ende
quelle

Antworten:

183

Wenn Sie Zugriff auf das Repository selbst haben (keine Arbeitskopie), sollten Sie in der Lage sein, das aktuelle Repository zu sichern, es so zu filtern, dass es nur Informationen zum Ordner docs enthält, und es in das andere Repository zu laden.

Wäre ungefähr so:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Ohne Zugriff auf das Repository können Sie den Revisionsverlauf nicht verwalten und müssen sich damit zufrieden geben, die Dateien in das neue Repository zu kopieren und festzuschreiben.

Samuel
quelle
1
Schönes Beispiel. Beachten Sie, dass diese Lösung, wie in der von mir verlinkten Dokumentation angegeben, alle Revisionen neu nummeriert, sodass keine "Leergut" vorhanden sind. Beachten Sie Folgendes, wenn Sie auf die Dokumentrevisionen an einer anderen Stelle verweisen.
Adam Bellaire
1
Ich schlug vor, leere Revisionen zu entfernen, um zu vermeiden, dass dem Ziel-Repository eine Reihe leerer Revisionen hinzugefügt werden, was höchstwahrscheinlich jeden verwirrt, der nichts über die Last wusste. Da --preserve-revprops die Festschreibungsnachrichten beibehält, anstatt die Standardnachricht zum Laden zu verwenden.
Samuel
11
Danke für die Antwort. Falls jemand wissen muss, wenn Sie mehr als einen Ordner benötigen, setzen Sie einfach ein Leerzeichen zwischen sie in die Include-Liste. Ex. ... Ordner einschließenEin OrdnerTwo
Robin Robinson
6
Revisionen neu zu nummerieren ist wahrscheinlich eine schlechte Idee, da Commit-Nachrichten und Tools zur Problemverfolgung möglicherweise darauf verweisen
Wim Coenen
5
Das hat bei mir funktioniert. Ich bin ein Windows-Benutzer (Visual SVN Server) und mein erster Befehl sah so aus, wenn er jemandem hilft:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris
30

svndumpfilter hat einen schwerwiegenden Fehler: Wenn eine Datei oder ein Pfad von einem Pfad, den Sie herausfiltern, in einen Pfad kopiert wurde, in den Sie filtern, kann svndumpfilter den Verlauf nicht ausfüllen, und der Auftrag schlägt fehl.

Sie können svndumpfilter2 verwenden, wenn dieses Problem auftritt .

compie
quelle
4
Hier ist ein besserer Link für svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin
In diesem Fall können Sie den erforderlichen Pfad zur Liste hinzufügen ... so spezifisch wie möglich ... und diese Einträge nach dem Import aus dem Projekt entfernen.
James Gawron
6

Dies wird in der SVN-Dokumentation erläutert. Lesen Sie den Abschnitt Repository-Wartung zu svndumpfilter... Hier wird speziell beschrieben, wie Sie Projekte aus einem zentralen Repository sichern und in neue, separate Repositorys verschieben.

Adam Bellaire
quelle
2

Ich glaube nicht, dass Sie dies aus der Ferne tun können (dh ohne eine lokale Kopie). Aber das sollte funktionieren: svn exportder Ordner vom ursprünglichen Server, dann svn addzu Ihrem neuen Repo.

Mögen:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Edit: D'oh, das lässt die Geschichte fallen. Verwenden Sie, svnadminwie Samuel beschreibt .

Peter Stone
quelle
3
Sie können die Revisionen jedoch nicht ohne Zugriff auf das Repository selbst behalten. Wenn Sie nur eine Arbeitskopie haben können, ist dies das Beste, was er tun kann.
Samuel
2

Zum späteren Nachschlagen:

In der SVN-Dokumentation wird klar berichtet:

Wenn Sie die Speicherauszugsdatei manuell bearbeiten möchten, um ein Verzeichnis der obersten Ebene zu entfernen, stellen Sie sicher, dass Ihr Editor nicht so eingestellt ist, dass Zeilenendezeichen automatisch in das native Format konvertiert werden (z. B. \ r \ n in \ n). da der Inhalt dann nicht mit den Metadaten übereinstimmt. Dadurch wird die Speicherauszugsdatei unbrauchbar.

Verwenden Sie sed oder Vim, um das Verzeichnis der obersten Ebene zu ersetzen, aber dieser Verzeichnisname war auch in einer Projektdatei enthalten !!!! Dies verursacht einen SVN-Ladeprüfsummenfehler.

Wenn Sie diesen Vorgang ausführen, ersetzen Sie keine Zeichenfolgen nur mit dem Pfadnamen sed.

Ersetzen Sie "Knotenpfad: alter_Pfad" durch "Knotenpfad: neuer_Pfad". Weitere Informationen finden Sie im SVN-Buch, Kapitel 5, „Repository-Verwaltung“.

nios
quelle
1

Ich habe versucht, die akzeptierte Antwort zu verwenden, aber ich hatte ein riesiges Repository und wollte ein kleines Verzeichnis exportieren. Ich konnte es mir nicht leisten, das gesamte Repository zu sichern.

Daher habe ich nur die Revisionen exportiert, bei denen sich mein Verzeichnis geändert hat (dies funktioniert möglicherweise nicht, wenn das zu exportierende Verzeichnis Verweise auf andere Stellen in Ihrem Repo enthält).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Sie müssen Ihre Repo-URL ( URL_to_docs), den Speicherort in server ( /svn/old_repo) und den Pfad zu den Dokumenten im Repository ( path/to/docs) ersetzen.

Sie können Ihre leicht bearbeiten, docs_only.dumpwenn Sie den Speicherort Ihres Dokumentverzeichnisses in Ihrem neuen Repository ändern möchten.

Renato
quelle