2010-01-12 10 views
32

Gibt es eine Möglichkeit, die Datei aus dem SVN-Repository einschließlich des gesamten Verlaufs zu löschen? Dieses Problem taucht auf, wenn ich große Binärdateien, die sich im Repo befinden, loswerden will.Datei mit allen Verlaufsdaten aus dem SVN-Repository löschen

Ich kenne nur einen Ansatz, der in dieser Situation helfen kann:

  1. Dump alle Repo mit Hilfe von svnadmin Dienstprogramm.
  2. Filter dumped Datei mit grep. Grep sollte Dateinamen und schreibt in die anderen Dump-Datei
  3. Import letzte Dump-Datei mit svnadmin

Aber das ist zu kompliziert und unzuverlässig verwenden. Vielleicht gibt es eine andere Lösung?

Antwort

6

Aber das ist zu kompliziert und unzuverlässig.

Ich würde nicht wissen, warum dies nicht als zuverlässig angesehen werden sollte. Allerdings, wenn Sie die Datei, Geschichte und alle vollständig loswerden wollen, egal was die Auswirkungen auf vorherige Revisionen dieser Datei war, gibt es nur eine Möglichkeit, dies zu tun, und dieser Weg ist in der Tat kompliziert. Und das zu Recht. SVN ist ein Tool mit einem einzigen Ziel: niemals eine Datei zu verlieren, selbst nachdem sie gelöscht wurde. Es anders zu machen, sollte hart sein.

29

Dies ist in letzter Zeit mit dem Befehl svndumpfilter viel einfacher geworden. Details finden Sie in der Subversion-Dokumentation here. Um Konflikte zu vermeiden (erklärt here), wird grundsätzlich ein Repo-Dump durchgeführt und jedes Commit wird wiederholt, wobei ein bestimmtes Dateipräfix ein- oder ausgeschlossen wird. Basic-Syntax:

svndumpfilter exclude yourfileprefix <yourdump> yournewdump 

ausschließen ist wahrscheinlich das, was die Frage Fragesteller ist auf der Suche, aber Sie können auch verwenden, um, sagen wir, einen Teilbaum des Repo extrahieren, um sie als sein eigenes Repository ausgliedern.

Die neueste Version von Subversion in Subversion (sehr Meta) kann auch Glob-Muster nehmen. Ich hatte vor kurzem alle PDF-Dateien aus einem Repo zu entfernen, und es war sehr leicht, wie dies getan:

svndumpfilter exclude --pattern '*.pdf' <dump> dump_nopdfs 

Weitere Nutzungsinformationen können durch den Aufruf svndumpfilter help und svndumpfilter help exclude finden.

+0

Also wäre der gesamte Prozess: 'svnadmin dump> myDump; svndumpfilter ausschließen myFile < myDump > newDump; Katze newDump | svnadmin myRepositoryURL laden; 'Richtig? – Shawn

+0

Ich habe es nicht getestet, aber das sieht richtig aus. –

+10

Ok, ich habe es versucht und der Prozess sieht eher so aus: 'svnadmin dump path_to_repository> old.dump; svndumpfilter ausschließen file_prefix < old.dump > new.dump; rm -rf Pfad_zu_repository; svnadmin create path_to_repository; svnadmin lädt path_to_repository Shawn

3

Ich war mit einem ähnlichen Problem konfrontiert, außer dass ich mehrere Dateien entfernen musste, nicht nur eine Datei, und wir sind auch auf Subversion 1.6, die die --patern-Anweisung nicht unterstützt.

- Backup aktuellen SVN

$ cp -R /svn /svnSAVE 

- Dump-Repository

$ svnadmin dump /svn/root > svnDump 

- neue Dump erstellen, während die sehr große Datei ohne

$ svndumpfilter exclude "/path/file.csv" <svnDump> newSvnDump0 
-- {note: should see a message like this}: 
--   Dropped 1 node: 
--     '/path/file.csv' 

- schaffen eine weitere neue Dump, während eine andere sehr große Datei ausgeschlossen

$ svndumpfilter exclude "/path/anotherFile.csv" <newSvnDump0> newSvnDump1 

- entfernen Sie die alte SVN

$ rm -rf /svn 

- neu erstellen die SVN-Verzeichnisse

$ mkdir -p /svn/root 

- bevölkern die frische Repository mit -

$ svnadmin create /svn/root 

die SVN neu erstellen der Dump

$ cat newSvnDump1 | svnadmin load /svn/root 

- Aktualisiere die conf Dateien aus der gespeicherten Kopie in die neue Kopie ...

$ cp /svnSAVE/root/conf/* /svn/root/conf 

nun das Repository sollte nicht enthalten die 2 große Dateien „file.csv“ und „anotherFile.csv“

0

Ich stimme McDowells Vorschlag zu, möchte aber vorschlagen, dass Sie die große Datei durch eine Textdatei ersetzen, die einfach den Hash der Datei für den entfernten Eintrag enthält.

Wenn Sie eine große Anzahl von z. B. .o-Dateien versehentlich in einem Build-Verzeichnis einchecken, ist dies möglicherweise nicht geeignet. Aber wenn Sie eine Reihe von binären Artefakten entfernen, die Sie nicht aus einem Verzeichnis, das eine Reihe von binären Artefakten enthält, die Sie wollen, haben Sie ein hohes Risiko, einen teuren Fehler zu machen. Sie sollten sie zumindest aus dem Stamm und den meisten Zweigen entfernen, aber einen Feature-Zweig voller Platzhalter-Textdateien mit dem Hash der ursprünglichen Binärdatei belassen. Dies kann zumindest genug sein, um herauszufinden, was später passiert ist. Stellen Sie sicher, dass eine streunende Kopie, die nicht gelöscht werden sollte, in der Tat die richtige Datei ist, und legen Sie sie unter Versionskontrolle zurück.

Und natürlich, die gesamte Repo bis zu etwas Read-only, wie ein paar M-Discs oder etwas, bevor Sie überhaupt darüber nachdenken, etwas von diesem Zeug zu tun.

Verwandte Themen