(gelöst, siehe unten im Fragetext)
Wenn ich schon lange danach suche, habe ich bis jetzt Folgendes:
- http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ und
- http://progit.org/book/ch9-7.html
Ziemlich die gleiche Methode, aber beide belassen Objekte in Packdateien ... stecken geblieben.
Was ich versucht habe:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
Ich habe immer noch Dateien im Paket, und so weiß ich es:
git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
Und das:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune
Das Gleiche...
Versucht git clone
Trick, es entfernte einige der Dateien (~ 3000 von ihnen), aber die größten Dateien sind noch da ...
Ich habe einige große Legacy-Dateien im Repository, ~ 200M, und ich möchte sie wirklich nicht dort haben ... Und ich möchte das Repository nicht auf 0 zurücksetzen :(
LÖSUNG: Dies ist der kürzeste Weg, um die Dateien loszuwerden:
- check .git / packed-refs - mein Problem war, dass ich dort eine
refs/remotes/origin/master
Zeile für ein Remote-Repository hatte, es löschen, sonst wird git diese Dateien nicht entfernen - (optional)
git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5
- um nach den größten Dateien zu suchen - (optional)
git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98
- um zu überprüfen, was diese Dateien sind git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names'
- um eine Datei aus allen Revisionen zu entfernenrm -rf .git/refs/original/
- um das Backup von git zu entfernengit reflog expire --all --expire='0 days'
- um alle losen Gegenstände zu verfallengit fsck --full --unreachable
- um zu überprüfen, ob lose Gegenstände vorhanden sindgit repack -A -d
- Umpackengit prune
- um diese Objekte endgültig zu entfernen
git
version-control
git-rewrite-history
Boris Churzin
quelle
quelle
for i in `git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5` ; do git rev-list --objects --all | grep $(echo $i | sed 's/ .*//g') ; done
Antworten:
Ich kann nicht sicher sagen, ohne Zugriff auf Ihre Repository-Daten, aber ich glaube, es gibt wahrscheinlich einen oder mehrere gepackte Refs, die noch auf alte Commits von vor Ihrer Ausführung verweisen
git filter-branch
. Dies würde erklären, warumgit fsck --full --unreachable
der große Blob nicht als nicht erreichbares Objekt bezeichnet wird, obwohl Sie Ihr Reflog abgelaufen und die ursprünglichen (entpackten) Refs entfernt haben.Folgendes würde ich tun (nachdem
git filter-branch
undgit gc
getan worden bin):1) Stellen Sie sicher, dass die Originalreferenzen weg sind:
rm -rf .git/refs/original
2) Alle Reflog-Einträge verfallen lassen:
git reflog expire --all --expire='0 days'
3) Überprüfen Sie, ob alte Refs verpackt sind
Dies kann möglicherweise schwierig sein, je nachdem, wie viele Refs Sie haben. Ich kenne keine Git-Befehle, die dies automatisieren, daher denke ich, dass Sie dies manuell tun müssen. Erstellen Sie ein Backup von
.git/packed-refs
. Jetzt bearbeiten.git/packed-refs
. Überprüfen Sie, ob alte Refs vorhanden sind (insbesondere, ob die Refs von verpackt wurden).git/refs/original
). Wenn Sie alte finden, die nicht vorhanden sein müssen, löschen Sie sie (entfernen Sie die Zeile für diesen Verweis).Überprüfen Sie nach dem Bereinigen der
packed-refs
Datei, obgit fsck
die nicht erreichbaren Objekte angezeigt werden:git fsck --full --unreachable
Wenn dies funktioniert hat und
git fsck
Ihr großer Blob nun als nicht erreichbar gemeldet wird, können Sie mit dem nächsten Schritt fortfahren.4) Packen Sie Ihre gepackten Archive neu ein
git repack -A -d
Dadurch wird sichergestellt, dass die nicht erreichbaren Objekte ausgepackt werden und ausgepackt bleiben .
5) Beschneiden Sie lose (nicht erreichbare) Gegenstände
git prune
Und das sollte es tun. Git sollte wirklich eine bessere Möglichkeit haben, gepackte Refs zu verwalten. Vielleicht gibt es einen besseren Weg, den ich nicht kenne. In Ermangelung eines besseren Weges
packed-refs
könnte die manuelle Bearbeitung der Datei der einzige Weg sein.quelle
Ich würde empfehlen, den BFG Repo-Cleaner zu verwenden , eine einfachere und schnellere Alternative zu dem
git-filter-branch
speziell für das Umschreiben von Dateien aus dem Git-Verlauf entwickelten. Eine Möglichkeit, Ihr Leben hier einfacher zu machen, besteht darin, dass standardmäßig alle Referenzen behandelt werden (alle Tags, Zweige, Dinge wie Refs / Fernbedienungen / Ursprung / Master usw.), aber es ist auch 10-50x schneller.Befolgen Sie diese Schritte hier sorgfältig: http://rtyley.github.com/bfg-repo-cleaner/#usage - aber das Kernbit ist genau das: Laden Sie das JAR der BFG herunter (erfordert Java 6 oder höher) und führen Sie diesen Befehl aus ::
Alle benannten Dateien
file_name
(die nicht in Ihrem letzten Commit enthalten sind) werden vollständig aus dem Verlauf Ihres Repositorys entfernt . Sie können danngit gc
die toten Daten entfernen:Das BFG ist im Allgemeinen viel einfacher zu verwenden als
git-filter-branch
- die Optionen sind auf diese beiden gängigen Anwendungsfälle zugeschnitten:Vollständige Offenlegung: Ich bin der Autor des BFG Repo-Cleaner.
quelle
git filter-branch --prune-empty
scheint die Lösung für meine Frage zu sein (obwohl Sie ein anderes Tool verwenden, lassen Sie mich bitte wissen, ob der BFG Repo-Cleaner dasselbe tun kann).Ich fand dies sehr hilfreich beim Entfernen eines ganzen Ordners, da mir das oben Genannte nicht wirklich geholfen hat: https://help.github.com/articles/remove-sensitive-data .
Ich benutzte:
quelle
Ich habe versucht, eine große Datei in der Geschichte loszuwerden, und die obigen Antworten haben bis zu einem gewissen Punkt funktioniert. Der Punkt ist: Sie funktionieren nicht, wenn Sie Tags haben. Wenn das Commit mit der großen Datei über ein Tag erreichbar ist, müssen Sie den Befehl filter-branchs folgendermaßen anpassen:
quelle
Siehe: Wie entferne ich vertrauliche Dateien aus dem Git-Verlauf?
Das Obige schlägt fehl, wenn die Datei in einer Version nicht vorhanden ist. In diesem Fall behebt der Schalter '--ignore-unmatch' das Problem:
Um dann alle losen Gegenstände aus dem Repostiry herauszuholen:
quelle
Sie haben verschiedene Gründe für eine immer noch große Git-Repo-Größe
git gc
, da nicht alle losen Gegenstände entfernt werden .Ich erläutere diese Gründe in " Reduzieren der Größe des Git-Repositorys" ".
Ein Trick, den Sie in Ihrem Fall testen sollten, wäre das Klonen Ihres "bereinigten" Git-Repos und ob der Klon die richtige Größe hat.
('"gereinigtes" Repo' ist das, bei dem Sie das angewendet haben
filter-branch
, und danngc
undprune
)quelle
git count-objects -v -> count: 0, size: 0, in-pack: 10021, packs: 1, size-pack: 244547, prune-packable: 0, garbage: 0
, ist aber:git clone test1 test2 -> Checking out files: 100% (8509/8509), done
Dies sollte durch den
git obliterate
Befehl in Git Extras ( https://github.com/visionmedia/git-extras ) abgedeckt werden .quelle
Ich hatte das gleiche Problem und fand auf Github ein großartiges Tutorial , in dem Schritt für Schritt erklärt wird, wie Sie versehentlich festgeschriebene Dateien entfernen können.
Hier ist eine kleine Zusammenfassung des Verfahrens, wie es Cupcake vorgeschlagen hat.
Wenn Sie eine Datei mit dem Namen haben
file_to_remove
, die aus dem Verlauf entfernt werden soll:quelle