2016-04-29 2 views
-1

Zuvor löschte ich Tausende von PDF-Dateien aus einem Git Repo. Aber das Problem ist, dass selbst wenn ich diese Dateien entfernt habe, sie in früheren Revisionen immer noch vorhanden sind, so dass ich sie immer noch zurückbekomme, indem ich auf den Verlauf zugreife. Und jetzt bekomme ich sehr große Packdateien, was sehr frustrierend ist.Vollständig Tausende von PDF-Dateien aus früheren Revisionen von Git entfernen?

Jetzt möchte ich alle diese .pdf-Dateien aus allen Revisionen von Git vollständig entfernen und ich möchte sie nicht immer und immer wieder, um die Größe meiner Repo zu reduzieren. Wie kann ich das machen? Alle PDF-Dateien wurden bei einem Commit entfernt.

Ich suchte auf Google und fand git filter-branch kann mein Problem lösen. Aber alle Lösungen, die ich gefunden habe, ist eine sehr große Datei in den Git-Revisionen zu finden und vollständig aus dem Repo zu löschen. Ich möchte Tausende von PDF-Dateien vollständig entfernen, die sehr viel Speicherplatz belegen.

Jede Hilfe wird sehr geschätzt. Danke.

+1

Ob Sie eine große Datei, viele große Dateien, viele kleine Dateien usw. entfernen, das Prinzip ist das gleiche. Der Befehl filter-branch extrahiert vorhandene Commits, wendet Ihre Filter an und führt neue Commits aus dem Ergebnis aus. Anschließend werden Branch-Labels (und Tags, wenn Sie einen Tag-Filter verwenden) angepasst, um auf die neuen Commits anstatt auf die alten Commits zu verweisen. Der schwierige Teil ist das Schreiben der Filter: Es ist einfacher, wenn die Dateien alle an einem bekannten Ort sind (wenn es nur eine große Datei gibt, ist das wirklich einfach). – torek

+0

@torek Leider sind die Dateien in vielen Verzeichnissen verteilt. Aber ich frage mich, ob ich regulären Ausdruck verwenden kann, um PDF-Dateien im 'git filter-branch'-Befehl zu mathchieren. –

Antwort

3

Per Kommentare in eine Antwort erweitert ...

Es gibt zwei einfache (na ja, "nicht sehr hart") Möglichkeiten, das zu lösen ist:

  1. Verwenden --tree-filter (sehr langsam) mit diesem Filter:

    git filter-branch ... \ 
        --tree-filter "find . -name '*.pdf' -print0 | xargs -0 rm" \ 
        ... 
    
  2. Verwenden --index-filter (viel schneller):

In jedem Fall sollten Sie --tag-name-filter cat einschließen, wenn Sie Tags wollen die kopierten Commits bewegen (und den Rest der Dokumentation lesen filter-branch auf verwenden).

Dies setzt voraus, dass Sie alle Dateien entfernen möchten, deren Namen *.pdf entsprechen. Wenn Sie selektiver sein müssen, beachten Sie, dass filter-branch nur den Filter mit eval $filter ausführt: Es gibt nichts, das besagt, dass der ...-Teil nicht ein Pfad zu einem Shellskript sein oder enthalten kann, wo Sie komplexe Tests schreiben können, ohne anpassen zu müssen sie in eine große eval -able Zeichenfolge.

Verwandte Themen