Wie zu entfernen/löschen eine große Datei vom commit-Historie in Git-repository?
Gelegentlich warf ich einen DVD-rip in ein website-Projekt, dann achtlos git commit -a -m ...
, und, Zack, die repo war aufgebläht von 2,2 gigs. Das nächste mal, ich habe ein paar edits, gelöschte video-Datei, und verpflichtet sich alles, aber die komprimierte Datei ist immer noch da in dem repository, in der Geschichte.
Ich weiß, kann ich damit beginnen, Zweige von denen verpflichtet und rebase einem Zweig auf einen anderen. Aber was soll ich tun, um zusammen die 2 verpflichtet, so dass die große Datei nicht zeigen, in der Geschichte und wurden gereinigt, garbage collection-Verfahren?
Dieser Artikel soll Ihnen helfen, help.github.com/removing-sensitive-data
Verwandte: Vollständig entfernen-Datei aus allen Git-repository commit-Historie.
Beachten Sie, dass wenn Sie Ihre große Datei in einem Unterverzeichnis, müssen Sie angeben, den vollen relativen Pfad.
im Zusammenhang help.github.com/articles/...
Verwandte: Vollständig entfernen-Datei aus allen Git-repository commit-Historie.
Beachten Sie, dass wenn Sie Ihre große Datei in einem Unterverzeichnis, müssen Sie angeben, den vollen relativen Pfad.
im Zusammenhang help.github.com/articles/...
InformationsquelleAutor culebrón | 2010-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die BFG-Repo-Reiniger, eine einfachere, schnellere alternative zu
git-filter-branch
speziell für das entfernen von unerwünschten Dateien aus dem Git-Geschichte.Befolgen Sie sorgfältig die Gebrauchsanweisung, der Kern ist einfach:
Alle Dateien über 100MB in der Größe (nicht in Ihrem neuesten commit) wird entfernt werden von Ihrem Git-repository-history. Sie können dann mit
git gc
zu reinigen entfernt die Toten Daten:Die BFG ist in der Regel mindestens 10-50x schneller als laufen
git-filter-branch
, und in der Regel einfacher zu bedienen.Vollständige Offenlegung: ich bin der Autor von den BFG-Repo-Reiniger.
Danke. Ich habe es ausprobiert 3 verschiedene Zeiten und alle gingen mit der gleichen Meldung. Also ich bin auch zu denken, dass Sie zu Recht über die remote-server konfiguriert ist, lehnen die nicht-fast-forward updates. Ich werde prüfen, nur einem Druck auf den repo aktualisiert, um eine Marke neue repo. Danke!!!
Perfekte, speichern Sie meine Zeit, vielen Dank. Übrigens, vielleicht tun sollte
git push --force
nach Ihrer Schritte, da sonst die remote-repo noch nicht geändert.+1 hinzufügen
git push --force
. Auch erwähnenswert: Kraft, drückt nicht zulässig ist, die remote (gitlab.com nicht standardmäßig. Hatte auf "Schutz aufheben" die Branche).Ich denke, dass die Trump-jargon das tool Ausgänge ist ein bisschen viel.
InformationsquelleAutor Roberto Tyley
Was Sie tun möchten, ist sehr störend, wenn Sie veröffentlicht die Geschichte, um anderen Entwicklern. Sehen "Wiederherstellen Von" Upstream "Stellungswechsel" in der
git rebase
- Dokumentation für die notwendigen Schritte nach der Reparatur Ihre Geschichte.Haben Sie mindestens zwei Möglichkeiten:
git filter-branch
und einen interaktiven rebase, die beide nachstehend erläutert.Mit
git filter-branch
Ich hatte ein ähnliches problem mit sperrigen binary test Daten aus einem Subversion-import und schrieb über entfernen von Daten aus einem git-repository.
Sagen, deine git-Geschichte ist:
Beachten Sie, dass
git lola
ist ein nicht-standard, aber sehr nützlich, alias. Mit der--name-status
wechseln, können wir sehen, Baum-Modifikationen, die mit jedem commit.In der "Sorglosen" Begehen (dessen SHA1-Objekt-name ist ce36c98) die Datei
oops.iso
ist der DVD-rip Hinzugefügt von Unfall und entfernt werden in den nächsten Begehen, cb14efd. Mit Hilfe der Technik beschrieben in der oben genannten blog-post, die Ausführung des Befehls ist:Optionen:
--prune-empty
entfernt begeht, die leer geworden (d.h., ändern Sie nicht den Baum) als Ergebnis der filter-operation. Im typischen Fall, diese option erzeugt eine sauberere Geschichte.-d
Namen ein temporäres Verzeichnis, das noch nicht existiert zu verwenden für den Aufbau der gefilterte Geschichte. Wenn Sie eine moderne Linux-distribution, die Angabe eines Baum in/dev/shm
führt zu schnelleren Ausführung.--index-filter
ist der main event und läuft gegen den index bei jedem Schritt in der Geschichte. Sie entfernen möchtenoops.iso
wo immer es gefunden wird, aber es ist nicht in allen verpflichtet. Der Befehlgit rm --cached -f --ignore-unmatch oops.iso
löscht den DVD-rip, wenn es vorhanden ist und nicht anders.--tag-name-filter
beschreibt, wie rewrite-tag-Namen. Ein filtercat
ist die Identität Betrieb. Das repository, wie im Beispiel oben, dürfen keine tags, aber ich habe diese option für die vollständige Allgemeingültigkeit.--
gibt das Ende der Optionen zugit filter-branch
--all
folgenden--
ist die Kurzform für alle refs. Das repository, wie im Beispiel oben, kann nur ein ref (master), aber ich habe diese option für die vollständige Allgemeingültigkeit.Nach einigen Buttern, die Geschichte ist nun:
Fest, dass das neue "Sorglos" commit fügt nur
other.html
ist und dass die "Entfernen" DVD-rip" commit ist nicht mehr auf dem master-branch. Die Niederlassung beschriftetrefs/original/refs/heads/master
enthält Ihre ursprünglichen commits in Fall, dass Sie einen Fehler gemacht haben. Um es zu entfernen, befolgen Sie die Schritte in "Checkliste für die Verkleinerung ein endlager."Für eine einfachere alternative, Klonen Sie das repository zu entsorgen Sie die unerwünschte bits.
Mit einem
file:///...
clone URL kopiert anstatt Objekte zu erstellen hardlinks nur.Nun Ihre Geschichte:
Die SHA1-Objekt-Namen für die ersten beiden commits ("Index" und "Admin-Seite") blieb die gleiche, weil die filter-operation nicht geändert haben diejenigen, die verpflichtet. "Leichtsinnig" verloren
oops.iso
und "Login-Seite" bekam einen neuen Elternteil, also Ihr SHA1s hat ändern.Interactive rebase
Mit einer Geschichte von:
den Sie entfernen möchten
oops.iso
von "Careless" als ob Sie nie aufgenommen, und dann "Entfernen" DVD-rip" ist nutzlos für Sie. So, unser plan geht in einen interaktiven rebase ist, um "Admin-Seite" Bearbeiten "Leichtsinnig" und verwerfen "Entfernen" DVD-rip".Läuft
$ git rebase -i 5af4522
startet einen editor mit dem folgenden Inhalt.Ausführung unserer Planung, wir ändern es zu
Ist, löschen wir die Zeile mit "Entfernen" DVD-rip" und ändern Sie den Betrieb auf "Leichtsinnig" zu werden
edit
eher alspick
.Speichern-verlassen des Editors fällt uns an einer Eingabeaufforderung mit der folgenden Meldung.
Als die Nachricht sagt uns, wir sind auf der "Sorglosen" Begehen wir Bearbeiten möchten, so dass wir zwei Befehle ausführen.
Die erste entfernt die infizierte Datei aus dem index. Der zweite ändert oder ergänzt "Leichtsinnig" werden die aktualisierten index und
-C HEAD
weist git an Wiederverwendung der alten commit-Nachricht. Schließlichgit rebase --continue
weiter geht es mit dem rest der rebase Vorgang.Dieser gibt eine Geschichte von:
ist das, was Sie wollen.
Fügen Sie die
-f
(oder--force
) - option, um Ihregit push
Befehl: “in der Regel, den Befehl verweigert update a remote ref, der nicht ein Vorfahre der lokalen ref verwendet, um diese zu überschreiben. Dieses flag deaktiviert die überprüfung. Dies kann dazu führen, das remote-repository zu verlieren begeht; verwenden Sie es mit Sorgfalt."Dies ist eine wunderbar ausführliche Antwort zu erklären, die Verwendung von git-filter-branch zu entfernen unerwünschte große Dateien aus der Geschichte, aber es ist erwähnenswert, dass seit Greg schrieb seine Antwort, Die BFG-Repo-Cleaner wurde veröffentlicht, und das ist oft schneller und einfacher zu verwenden - siehe meine Antwort für details.
Nachdem ich eine der oben genannten Verfahren, das remote-repository (GitHub) NICHT löschen, die große Datei. Nur die lokale macht. Ich force push und nada. Was bin ich?
dies funktioniert auch auf Verzeichnisse.
... "git rm --cached -rf --ignore-unmatch path/to/dir"...
InformationsquelleAutor Greg Bacon
Warum nicht diese einfache, aber leistungsfähige Befehl?
Den
--tree-filter
option führt den angegebenen Befehl nach jedem checkout des Projektes und dann recommits die Ergebnisse. In diesem Fall entfernen Sie eine Datei namens DVD-rip-aus jeder Schnappschuss, ob es existiert oder nicht.Sehen dieser link.
Viel besser als die bfg. Ich war nicht in der Lage zu reinigen-Datei von git mit der bfg, aber mit diesem Befehl geholfen
Das ist großartig. Nur ein Hinweis für andere, die Sie haben pro Filiale, wenn Sie die große Datei in mehrere Zweige.
Auf Windows hab ich
fatal: bad revision 'rm'
, die ich behoben, indem"
statt'
. Insgesamt Befehl:git filter-branch --force --index-filter "git rm --cached -r --ignore-unmatch oops.iso" --prune-empty --tag-name-filter cat -- --all
Auch mein Befehl nicht funktioniert, wenn
\
als Pfad-separator - sogar auf Windows. Ich musste/
.InformationsquelleAutor Gary Gauh
(Die beste Antwort die ich gesehen habe zu diesem problem ist: https://stackoverflow.com/a/42544963/714112 , kopiert, da dieser thread scheint hoch in der Google-Suche-Ranking aber, dass andere nicht)
? Eine rasant schnelle shell-Einzeiler ?
Diesem shell-Skript zeigt alle blob-Objekte im repository, sortiert vom kleinsten zum größten.
Für mein Beispiel repo, es lief über 100 mal schneller als die anderen, die hier gefunden werden.
Auf meinem guten alten Athlon II X4 system, es behandelt die Linux Kernel repository mit seinen 5,622,155 Objekte in etwas mehr als eine minute.
Der Basis-Skript
Beim ausführen obigen code erhalten Sie schöne lesbare Ausgabe wie diese:
? Schnelle Entfernen Der Datei ?
Angenommen, Sie wollen dann entfernen Sie die Dateien
a
undb
aus jedem commit aus erreichbarHEAD
können Sie diesen Befehl verwenden:--tag-name-filter cat
neu-tag der neuen entsprechenden begeht, wie Sie umgeschrieben werden, d.h.,git filter-branch --index-filter 'git rm --cached --ignore-unmatch a b' --tag-name-filter cat HEAD
(siehe in diesem Zusammenhang Antwort)Mac-Anweisungen und einige andere Infos erscheinen in der ursprünglichen verlinkten post
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <filename>' HEAD
workorder rechts von der Fledermausmeine Lieblings-Antwort. ein leichtes zwicken zu verwenden, auf mac os (mit gnu-Befehle)
git rev-list --objects --all \ | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \ | awk '/^blob/ {print substr($0,6)}' \ | sort --numeric-sort --key=2 \ | gnumfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
InformationsquelleAutor Sridhar-Sarnobat
Diesen Befehlen gearbeitet, in meinem Fall:
Es ist etwas anders als die oben genannten Versionen.
Für diejenigen, die brauchen, drücken Sie diesen auf github/bitbucket (ich habe nur getestet, mit bitbucket):
Aus irgendeinem Grund mkljun version ist nicht reduziert, git Raum, in meinem Fall, hatte ich auch schon entfernt wurden die Dateien von index mithilfe
git rm --cached files
. Greg Bacon ' s Satz ist vollständiger, und ganz die gleichen zu dieser mine, aber er verpasste den --force-index für die Fälle, wenn Sie mit filter-branch für mehrere Male, und er schrieb so viel info, dass meine version ist wie resume.Das wirklich geholfen, aber ich brauchte, um das
-f
option nicht nur-rf
hiergit rm --cached -rf --ignore-unmatch oops.iso
stattgit rm --cached -r --ignore-unmatch oops.iso
als pro @lfender6445 untenInformationsquelleAutor Kostanos
Nach versuchen nahezu jede Antwort in SO, fand ich endlich dieses Schmuckstück schnell wieder entfernt und gelöscht werden, die große Dateien in mein repository und erlaubt mir erneut, die Synchronisierung durchzuführen: http://www.zyxware.com/articles/4027/how-to-delete-files-permanently-from-your-local-and-remote-git-repositories
CD zu Ihrem lokalen Arbeitsordner, und führen Sie den folgenden Befehl ein:
ORDNERNAME mit ersetzen der Datei oder dem Ordner, den Sie entfernen möchten, aus der gegebenen git-repository.
Sobald dies erledigt ist, führen Sie die folgenden Befehle zum bereinigen der lokalen repository:
Nun push alle änderungen in das remote-repository:
Diese bereinigt das remote-repository.
Dieser arbeitete für mich auch. Entledigt von einem bestimmten Ordner (in meinem Fall, eine, die enthaltenen Dateien zu groß sind oder ein Github-repo) auf das repository, aber hält es auf dem lokalen Dateisystem, falls diese existiert.
InformationsquelleAutor Justin
Nur beachten, dass diese Befehle können sehr zerstörerisch sein. Wenn immer mehr Menschen arbeiten auf dem repo Sie haben alle zu ziehen, den neuen Baum. Die drei Mitte-Befehle sind nicht erforderlich, wenn Ihr Ziel ist NICHT die Größe zu reduzieren. Da die filter-branch erstellt ein backup der gelöschten Datei und es kann dort bleiben für eine lange Zeit.
Ich habe diesen Befehl:
git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch oops.iso' --prune-empty --tag-name-filter cat -- --all
anstatt zuerst aus Ihrem codeInformationsquelleAutor mkljun
git filter-branch --tree-filter 'rm -f path/to/file' HEAD
funktionierte ziemlich gut für mich, obwohl ich lief in das gleiche problem wie beschrieben hier, die ich gelöst habe, indem Sie die folgenden dieser Vorschlag.
Den pro-git Buch hat ein ganzes Kapitel zu die Geschichte umzuschreiben - haben Sie einen Blick auf die
filter-branch
/Entfernen Sie eine Datei aus Jedem Commit Abschnitt.InformationsquelleAutor Thorsten Lorenz
Wenn Sie wissen, Begehen, wurde kürzlich statt durch den gesamten Baum, tun Sie Folgendes:
git filter-branch --tree-filter 'rm LARGE_FILE.zip' HEAD~10..HEAD
InformationsquelleAutor Soheil
Lief ich in diese mit ein bitbucket-account, wo ich hatte versehentlich gespeichert riesige *.jpa backups von meiner Seite.
git filter-branch --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch MY-BIG-DIRECTORY-OR-FILE' --tag-name-filter cat -- --all
Relpace
MY-BIG-DIRECTORY
mit den betreffenden Ordner komplett neu schreiben Ihre Geschichte (einschließlich tags).Quelle: http://naleid.com/blog/2012/01/17/finding-and-purging-big-files-from-git-history
InformationsquelleAutor lfender6445
Können Sie dies tun, indem Sie die
branch filter
Befehl:git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD
InformationsquelleAutor John Foley
Ich im Grunde getan, was war auf diese Antwort:
https://stackoverflow.com/a/11032521/1286423
(für Geschichte, werde ich die copy-paste es hier)
Es hat nicht funktioniert, weil ich gerne umbenennen und bewegen vieles. So manche große Datei, die waren im Ordner, die umbenannt wurden, und ich denke, dass der gc konnte nicht löschen Sie den Verweis auf diese Dateien, weil der Verweis in der
tree
Objekte verweisen auf diese Datei.Meine ultimative Lösung, um wirklich zu töten, es war:
Meinem repo (die
.git
) veränderte sich von 32 MB auf 388KB, dass auch filter-branch konnte nicht sauber.InformationsquelleAutor Dolanor
Verwenden Git Extensions, es ist ein UI-Werkzeug. Es hat ein plugin namens "große Dateien Finden" findet die lage Dateien in repositories und ermöglicht das entfernen Sie permenently.
Nicht verwenden 'git filter-branch' bevor Sie dieses tool verwenden, da es nicht in der Lage, Dateien zu suchen, entfernt von 'filter-branch' (Obwohl 'filter-branch' nicht entfernen, Dateien vollständig aus dem repository pack-Dateien).
Ja, seine langsam, aber funktioniert... wissen Sie etwas schneller?
Noch nicht benutzt, aber BFG Repo-Reiniger, als je eine andere Antwort auf dieser Seite.
InformationsquelleAutor Nir
Wenn du dieses problem,
git rm
wird nicht ausreichen, wie git merkt sich, dass die Datei existierte einmal in unserer Geschichte, und so wird immer eine Referenz.Machen alles noch schlimmer, rebasierung ist nicht leicht, weil alle Verweise auf den blob zu verhindern, git garbage collector Aufräumen den Raum. Dieses umfasst die remote-Referenzen und reflog Referenzen.
Ich zusammen
git forget-blob
, ein kleines Skript, das versucht, das entfernen Sie alle diese Hinweise, und dann wird mit git-filter-branch zu umschreiben, dass jeder commit in den Zweig.Sobald Sie Ihre blob ist komplett unreferenzierte,
git gc
wird es loswerdenDie Verwendung ist ziemlich einfach
git forget-blob file-to-forget
. Sie können mehr info hierhttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Lege ich diese zusammen, vielen Dank für die Antworten von Stack Overflow und einige blog-Einträge. Credits zu Ihnen!
InformationsquelleAutor nachoparker
git filter-branch
ist ein mächtiger Befehl, können Sie es verwenden, löschen einer großen Datei von der Geschichte verpflichtet. Die Datei wird bleiben für eine Weile und Git zu entfernen wird es in der nächsten garbage collection.Unten ist der komplette Prozess von der deleteing Dateien aus commit-Historie. Zur Sicherheit führen Sie zuerst das Kommando auf einem neuen Zweig:
InformationsquelleAutor zhangyu12