webentwicklung-frage-antwort-db.com.de

Löschen Sie die Datei mit dem gesamten Verlauf aus dem svn-Repository

Gibt es eine Möglichkeit, Dateien aus dem svn-Repository einschließlich des gesamten Verlaufs zu löschen? Dieses Problem tritt auf, wenn ich große Binärdateien im Repo-Format loswerden möchte. 

Ich kenne nur einen Ansatz, der in dieser Situation helfen könnte:

  1. Alle Repo-Dateien mit Hilfe des Dienstprogramms svnadmin ausgeben.
  2. Abgewiesene Datei mit grep filtern. Grep sollte Dateiname verwenden und in die andere Dump-Datei schreiben
  3. Letzte Dump-Datei mit svnadmin importieren

Dies ist jedoch zu kompliziert und unzuverlässig. Vielleicht gibt es eine andere Lösung?

35
altern

Mit dem Befehl svndumpfilter ist dies in letzter Zeit viel einfacher geworden. Details finden Sie in der Subversion-Dokumentation hier . Um Konflikte zu vermeiden (erklärt hier ), benötigt es einen Repo-Dump und führt jedes Commit erneut aus, entweder mit oder ohne ein gegebenes Dateipräfix. Grundlegende Syntax:

svndumpfilter exclude yourfileprefix < yourdump > yournewdump

Ausschließen ist wahrscheinlich das, wonach der Fragesteller sucht, aber Sie können auch include verwenden, um beispielsweise einen Unterbaum des Repos zu extrahieren, um ihn als sein eigenes Repository auszuspalten.

Die neueste Version von Subversion in Subversion (sehr Meta) kann auch Glob-Muster annehmen. Ich musste vor kurzem alle pdfs aus einem Repo entfernen und es war sehr einfach so:

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

Weitere Informationen zur Verwendung finden Sie unter Aufruf von svndumpfilter help und svndumpfilter help exclude.

32
John McDonnell

Dies ist jedoch zu kompliziert und unzuverlässig. 

Ich würde nicht wissen, warum dies nicht als zuverlässig angesehen werden sollte. Wenn Sie jedoch die Datei, den Verlauf und alle Dateien vollständig loswerden möchten, ist es nur eine Möglichkeit, dies zu tun, und zwar unabhängig von der Auswirkung auf die vorherigen Versionen dieser Datei. Und das zu Recht. SVN ist ein Werkzeug mit einem einzigen Ziel: Sie verlieren niemals Dateien, selbst nachdem sie gelöscht wurden. Wenn man es zwingt, etwas anderes zu tun, muss es hart sein. 

6
sbi

Ich war mit einem ähnlichen Problem konfrontiert, mit der Ausnahme, dass ich mehrere Dateien entfernen musste, nicht nur eine Datei. Außerdem haben wir Subversion 1.6, die die Direktive --patern nicht unterstützt. 

- Backup-Strom SVN

$ cp -R /svn  /svnSAVE

- Depot ausgeben

$ svnadmin dump /svn/root > svnDump

- Erstellen Sie einen neuen Speicherauszug, während Sie die sehr große Datei ausschließen

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

- Erstellen Sie einen weiteren neuen Speicherauszug, während Sie eine weitere sehr große Datei ausschließen

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

- entferne das alte svn 

$ rm -rf /svn

- Erstellen Sie die SVN-Verzeichnisse neu

$ mkdir -p /svn/root

- das SVN neu erstellen

$ svnadmin create /svn/root

- Füllen Sie das frische Repository erneut mit dem Dump auf

$ cat newSvnDump1 | svnadmin load /svn/root

- Aktualisieren Sie die Conf-Dateien von der gespeicherten Kopie in die neue Kopie ...

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

Jetzt sollte das Repository nicht die 2 großen Dateien "file.csv" und "anotherFile.csv" enthalten.

3
user3892260

Ich stimme dem Vorschlag von McDowell zu, möchte jedoch vorschlagen, die große Datei durch eine Textdatei zu ersetzen, die lediglich den Hash der Datei für den entfernten Eintrag enthält.

Wenn Sie eine große Anzahl von .o-Dateien haben, die versehentlich in einem Build-Verzeichnis eingehen, ist dies möglicherweise nicht geeignet. Wenn Sie jedoch eine Reihe binärer Artefakte entfernen, die Sie nicht möchten, aus einem Verzeichnis, das eine Reihe binärer Artefakte enthält, die Sie wirklich möchten, besteht ein hohes Risiko, dass Sie einen teuren Fehler machen. Erwägen Sie mindestens, sie aus dem Stamm und den meisten Verzweigungen zu entfernen, einen Funktionszweig jedoch mit Platzhaltertextdateien und dem Hash der ursprünglichen Binärdatei belassen. Dies kann zumindest ausreichen, um herauszufinden, was später geschehen ist, zu überprüfen, ob eine nicht gelöschte, verirrte Kopie tatsächlich die richtige Datei ist, und sie unter Revisionskontrolle zu stellen.

Und natürlich sollten Sie das gesamte Repo auf etwas Nur-Lesen-Dateien, wie ein paar M-Discs oder etwas anderes, übertragen, bevor Sie überhaupt darüber nachdenken.

0
breakpoint