Wie zu identifizieren und potenziell große binäre Commits innerhalb einer SVN-Repository entfernen?

StackOverflow https://stackoverflow.com/questions/2176803

  •  24-09-2019
  •  | 
  •  

Frage

Ich arbeite mit einer SVN-Repository, das über 3 Jahre alt ist, enthält über 6.100 Commits und ist über 1,5 GB groß. Ich mag die Größe der SVN-Repository reduzieren. (Ich bin nicht über die Größe eines vollständigen SVN Export sprechen - ich die volle Repository bedeuten, wie es auf dem Server vorhanden wäre), bevor es zu einem neuen Server zu verschieben

Die aktuelle Repository enthält den Quellcode für alle unsere Software-Projekten, aber es enthält auch relativ große binäre Dateien nicht von Bedeutung, wie:

  • Voll Installateure für eine Reihe von 3rd-Party-Tools.
  • .jpg & .png-Dateien (die unmodifizierte Exporte von PSDs sind, die im selben Ordner leben).
  • Bin und Obj-Ordner (die dann 'SVN ignoriert' die nächste Commit).
  • ReSharper Verzeichnisse.

Eine Reihe dieser großen Dateien wurden ‚SVN gelöscht‘, da sie hinzugefügt wurden, ein weiteres Problem der Schaffung der größten Straftäter identifing.

Ich möchte entweder:

  • Erstellen Sie eine neue SVN-Repository, das nur den Code für alles Software-Projekte enthält -. Es ist wirklich wichtig , dass die kopierten Dateien behalten ihre SVN Geschichte aus dem alten Repository
  • Entfernen Sie die großen binären Commits und Dateien aus dem vorhandenen Repository.

Sind entweder dieser möglich?

War es hilfreich?

Lösung

Du musst benutzen svnadmin dump eine Abbilddatei des aktuellen Repository zu erhalten und möglicherweise svndumpfilter die Dump-Datei zu verarbeiten. Sie können auch die dumpfile manuell ändern, solange Sie sind vorsichtig.

Es ist wahrscheinlich nicht eine schnelle und einfache Aufgabe sein, aber es kann getan werden. Ich habe etwas ähnliches, nur in einem viel kleineren Repository getan. Ich hatte ein Repo mit etwa 150 Revisionen, die über 600 MB haben.

Machen Sie einen Dump von Ihrer aktuellen Repository, die notwendigen Änderungen vornehmen und versuchen, die modifizierte dumpfile in ein neues Repository zu laden. Prüfen Sie dann das neue Repository sicher, alles zu machen ist immer noch Sinn macht (Die Geschichte ist immer noch richtig, keine seltsamen Veränderungen in Pfaden, ...).

Andere Tipps

Other ist recht svnadmin dump etc. So etwas werden Ihnen einen groben Zeiger auf Revisionen erhalten, dass viele Daten in Ihrem Repo hinzugefügt und sind Kandidaten für svndumpfilter:

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do
   echo "revision $r is " `svn diff -c $r | wc -c` " bytes";
done

Sie können auch so etwas wie dies versuchen, Revisionen zu finden, die Dateien mit einer bestimmten Erweiterung hinzugefügt (hier .jpg):

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$"

Wenn Sie Dateien aus dem Repository gelöscht mit „SVN löschen“, hast du nicht gelöscht tatsächlich die Dateien. Dies würde die Schönheit des SVN sein. Sobald eine Datei zum Repository hinzugefügt wird, ist es für immer dort (es sei denn mit Dump & Last). Bei „Löschen“, um die Dateien, die Sie erstellen tatsächlich eine neue Revision, dass Marken der Löschung, aber die Dateien weiterhin in früheren Versionen existieren.

Ich habe einige Dump & Last getan, aber in einem viel viel größer Repository. Rund 60.000 (!!!) Revisionen. Es brauchte Zeit, aber am Ende, nach sorgfältiger Beladung wird das Repository wieder aufgebaut.

Ihre einzige Möglichkeit ist, die Revisionen aufzulisten, dass die Dateien hinzugefügt wurden, geändert und gelöscht werden. Dann werfen die Revisionen dazwischen, und sie in der richtigen Reihenfolge laden. BE AWARE, gibt es keinen Raum für Fehler. Wenn Sie einen Fehler machen, müssen Sie von vorne beginnen. Dump & Last von Anfang an.

Mein Vorschlag, wenn die großen Dateien so ein Problem sind, sollten ohne Geschichte einer neu frisch Repository zu schaffen. Halten Sie die alte für Geschichte Vergleich, und starten Sie aus frischen arbeiten.

Good Luck.

Wenn Sie nur die beanstandeten Commits Nötige zu finden, und Sie haben Zugriff auf den Server des Repository-Hosting: Look für große Dateien in db / Drehzahl-Unterverzeichnis des Repository (vorausgesetzt, es fsfs-Format verwendet).

Ist das nicht nur ein anderes Problem, mit einem zusätzlichen Schritt? D. h Sie brauchen, um Dateien zu finden, dass Sie große und binär sein betrachten, und dann zu überprüfen, ob sie tatsächlich von SVN verwaltet werden oder lokal gebaut worden sind (oder aus dem parallelen Asset-System importiert, wenn es bereits vorhanden ist).

Also, nur die Dateien finden, dann tun svn info auf sie, wenn sie sind Teil des Endlagers zu erfahren.

Nur ein kleiner Gedanke, Sie sagen, dass der aktuelle Zustand des Repository (die aktuelle HEAD) ist gut, das heißt, die großen binären Dateien sind in der Vergangenheit SVN delete'ed worden. Deshalb Ihr Problem ist lediglich die Größe des Repository?

Ich weiß, Sie sagen, Sie mögen alle halten, die Geschichte zu begehen, sondern als Option, könnten Sie zwei Deponien tun, eine für die gesamte Revisionsgeschichte und einen für die aktuelle HEAD-Revision.

Wenn Sie den vollständigen Dump setzen auf eine DVD zum Beispiel würden Sie die Daten zur Verfügung, wenn Sie es jemals nötig, aber man kann dann das ganze Repository löscht und SVN, um den Revisions Dump laden Sie mit einer kleinen sauberen Repository zu verlassen.

Es ist auch möglich, von einer bestimmten Revision ab dump, anstatt nur den Kopf, so zum Beispiel, um die letzten 3 Monate der Revisionen halten konnte und Dump alles ältere auf eine DVD ....

Ausarbeiten auf Other Antwort, hier ist was für mich speziell bearbeitet:

svnadmin create new-repo
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo

Sie könnten in der Lage sein, Ihre Obj und Bin Verzeichnisse auszuschließen, indem sie an den svndumpfilter Befehl hinzufügen -. Ich kann es nicht versucht

Auch Subversion fsfs-stats Programm (neu in Subversion 1.8, ersetzt durch in 1,9 von svnfsfs stats) könnte für die Quantifizierung der Dateitypen und bestimmte Dateien nützlich sein, die das Repository füllen sich.

Dies könnte die Repositories für den Vergleich später nützlich sein:

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top