2009-03-25 11 views
9

Ich habe ein wachsendes Repository, das ein Dutzend Projekte enthält, die ich mit TortoiseSVN verwalte (da ich völlig neu bin und die Ins und Outs noch nicht kenne). Der Speicherplatz, den ich für das Repository haben muss, ist begrenzt, daher möchte ich es sichern und dann einige der älteren Versionen entfernen. Zum Beispiel, wenn ein Projekt in der Version 50 ist, möchte ich nur 50,49,48 behalten.Wie säubere ich ein Subversion-Repository am besten?

+2

Nr an ​​einen größeren Raum das Repository verschieben. – yfeldblum

+0

Sie sollten das Buch "Versionskontrolle mit Subversion" (kostenlos wie in Bier) unter http://svnbook.red-bean.com/ lesen, um einen besseren Überblick über die Versionskontrolle zu bekommen. –

Antwort

1

Es gibt keine Möglichkeit, ein Repository bei einer bestimmten Revision in der beschriebenen Weise zu "schnippen". Was Sie tun könnten, ist svn export das gesamte Repository bei der gewünschten Revision, dann importieren Sie es in ein neues Repository, und wiederholen Sie die Commits von den Revisionen danach aus Ihrer Protokolldatei in das neue Repository. Das ist nicht trivial.

Wenn Sie nur einige überladene Pfade aus Ihrem Repository ausschließen möchten und direkten Zugriff auf das Dateisystem haben, in dem sich das Repository befindet, können Sie eine Kombination von svnadmin und svndumpfilter verwenden, um die gewünschten Pfade auszuwählen beschneide alle anderen.

Beachten Sie, dass das, was Sie beschreiben, mehr oder weniger gegen den Punkt von Subversion gerichtet ist: Es soll alles behalten. Wenn Sie häufig Probleme damit haben, überlegen Sie sich, ob Sie die Check-in-Praktiken verbessern möchten. Oder erwäge die Verwendung von Git, was diese Art von Experimenten praktisch frei macht.

+0

Zweige (SVN-Kopie) in Subversion sind fast frei, sowohl in Zeit und Raum. Und beginnend mit subversion 1.6 wird bei der Zusammenführung von Patches zwischen Zweigen die gemeinsame Nutzung von Repräsentationen verwendet, um die Duplizierung von Daten zu vermeiden. Ich habe keine Ahnung, was du damit meinst, indem du sagst: "Zweige sind in Svn Raum-teuer". –

+0

Im Allgemeinen ist das Herumspielen mit svn-dumpfilter viel arbeitsintensiver als das Herumspielen mit git-filter-branch und/oder .git/info/grafts. Ich habe svn-dumpfilter stark gepatcht, um mehr Arten von Verlaufsbearbeitung zu unterstützen, und es ist immer noch kein nettes Werkzeug. – emk

+0

@wcoenen: Sie haben Recht. Ich habe das überhaupt nicht gut formuliert. @emk: Einverstanden, es ist ziemlich schrecklich. Heutzutage verwende ich hauptsächlich Git. –

12

Entfernen von alten Revisionen Art der Niederlagen der Versionskontrolle, aber Sie können nur die Revisionen, die Sie behalten möchten, entleeren, dann legen Sie sie in eine neue Repo, und löschen Sie die alte.

svnadmin dump /path/to/current/repo -r48:50 > svn.dump 
svnadmin create /path/to/new/repo 
svnadmin load /path/to/new/repo < svn.dump 

Oder verwenden svndumpfilter auf/Ausschluss der besonderen Bits, die Sie wollen, usw. Es gibt auch einige Informationen in den SVN-FAQs zu removal, die Sie nützlich finden können.

+0

Wird nicht nur die spezifischen * commits * aus den Revisionen 48 bis 50 gelöscht? Ich denke, er sucht nach dem Zustand des Archivs wie bei Revision 48, nicht nur das Commit dort. –

+0

Ich habe es gerade versucht. Das macht nicht das, was das OP meiner Meinung nach überhaupt will: es bekommt * nur * die Commits von diesen Revisionen. Sie erhalten nicht den Status des Repositorys in Revision 48, gefolgt von allen Commits, die notwendig sind, um es auf Revision 50 zu bringen. –

+0

John: Wie läuft es dir? Es funktioniert gut für mich. Es gibt die erste angegebene Revision vollständig aus, dann wird die letzte Revision bis zur letzten Revision ausgeführt. Nur wenn Sie den Schalter "--deltas" angeben, werden nur die Commits gelöscht. –

4

Kann ich ältere Revisionen oder Repositorys löschen, um Speicherplatz freizugeben?

Die kurze Antwort ist nein. Die Art und Weise, wie Subversion und CVS arbeiten, besteht darin, dass sie eine ganze Historie von Änderungen behalten, einschließlich gelöschter Dateien, Binärdateien usw. Jede Revision hängt von der letzten Revision ab, so dass Sie nicht einfach irgendwo in der Mitte eine Revision ausschneiden können Beschädigen Sie Ihr Repository. Es gibt zwei Dinge, die Sie tun können, wenn Ihnen der Platz ausgeht: 1) Löschen Sie Ihr Modul und erstellen Sie es neu, indem Sie nur die HEAD-Revision verwenden, die alle alten Revisionen löscht (Sie verlieren jedoch Ihren Commit-Verlauf). 2) Die bessere Option - Upgrade auf einen höheren Plan :-). Dies ist weniger ein Problem mit Git, da es viel weniger serverseitige Speicheranforderungen hat.

Wie kann ich eine Datei vollständig aus dem Repository-Verlauf entfernen?

Es gibt spezielle Fälle, in denen Sie alle Beweise für eine Datei oder ein Commit zerstören möchten. (Vielleicht hat jemand versehentlich ein vertrauliches Dokument verfasst.) Das ist nicht so einfach, da Subversion bewusst darauf ausgelegt ist, niemals Informationen zu verlieren. Revisionen sind unveränderliche Bäume, die aufeinander aufbauen. Das Entfernen einer Revision aus dem Verlauf würde einen Domino-Effekt verursachen, der in allen nachfolgenden Revisionen Chaos verursachen und möglicherweise alle Arbeitskopien ungültig machen würde.

Das Projekt hat jedoch Pläne, irgendwann einen Befehl svnadmin obliterate zu implementieren, der die Aufgabe des permanenten Löschens von Informationen bewerkstelligen würde. (Siehe Ausgabe 516.)

In der Zwischenzeit ist Ihre einzige Zuflucht zu Svnadmin Dump Ihr ​​Repository, dann Pipe die Dumpdatei durch Svndumpfilter (mit Ausnahme der schlechten Pfad) in eine Svnadmin Ladebefehl. Details dazu finden Sie in Kapitel 5 des Subversion-Buchs.

aus zitiert:

http://subversion.apache.org/faq.html#removal

http://codesion.com/benefits/faq.htm#deleterevisions

Verwandte Themen