Ich habe versehentlich eine riesige Binärdatei hinzugefügt, festgeschrieben und mit meinem neuesten Commit in ein Git-Repository verschoben.
Wie kann ich Git veranlassen, die Objekte zu entfernen, die für dieses Commit erstellt wurden / wurden, damit mein .git
Verzeichnis wieder auf eine normale Größe verkleinert wird?
Edit : Danke für deine Antworten; Ich habe verschiedene Lösungen ausprobiert. Keiner hat funktioniert. Zum Beispiel hat der von GitHub die Dateien aus dem Verlauf entfernt, aber die .git
Verzeichnisgröße hat sich nicht verringert:
$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten
$ git log -p # looks nice
$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done.
Writing objects: 100% (625/625), done.
Total 625 (delta 351), reused 0 (delta 0)
$ du -hs .git
174M .git
$ # still 175 MB :-(
git-repack -a
gefolgt vongit-prune-packed
zum Beispiel. Siehe blog.felipebalbi.com/2007/12/19/…filter-branch
,gc
,repack
, ...), nein, Sie sollten nicht schlecht sehen überhaupt begehen. Dies ist ein Zeichen dafür, dass die Reinigung nicht wie erwartet stattgefunden hat.Antworten:
Ich habe dies an anderer Stelle beantwortet und werde es hier kopieren, da ich stolz darauf bin!
... und ohne weiteres darf ich Ihnen dieses nützliche Skript vorstellen, git-gc-all, das garantiert Ihren gesamten Git-Müll entfernt, bis zusätzliche Konfigurationsvariablen verfügbar sind:
Die Option --aggressive kann hilfreich sein.
HINWEIS: Dadurch werden ALLE nicht referenzierten Objekte entfernt. Weinen Sie also nicht zu mir, wenn Sie später entscheiden, dass Sie einige davon behalten möchten!
Möglicherweise müssen Sie auch zuerst so etwas ausführen, oh je, git ist kompliziert !!
Ich habe das alles hier in ein Skript geschrieben:
http://sam.nipl.net/b/git-gc-all-ferocious
quelle
xargs
Befehl erzeugt unter OS X einen Fehler aufgrund einer nicht erkannten Option. Einfachste Lösung: Installieren Sie GNU xargs über Homebrewbrew install findutils
und ersetzen Sie esxargs
durchgxargs
.Dein
git reflog expire --all
ist falsch. Es werden Reflog-Einträge entfernt, die älter als die Ablaufzeit sind, die standardmäßig 90 Tage beträgt. Verwenden Siegit reflog expire --all --expire=now
.Meine Antwort auf eine ähnliche Frage befasst sich mit dem Problem, nicht verwendete Objekte wirklich aus einem Repository zu entfernen.
quelle
1) Entfernen Sie die Datei aus dem Git-Repo (und nicht aus dem Dateisystem):
git rm --cached path/to/file
2) Verkleinern Sie das Repo mit:
git gc
,oder
git gc --aggressive
git prune
oder eine Kombination der oben genannten, wie in dieser Frage vorgeschlagen: Reduzieren Sie die Größe des Git-Repositorys
quelle
Diese Anleitung zum Entfernen vertraulicher Daten kann mit derselben Methode angewendet werden. Sie schreiben den Verlauf neu, um diese Datei aus jeder Revision zu entfernen, in der sie vorhanden war. Dies ist destruktiv und führt zu Repo-Konflikten mit anderen Checkouts. Warnen Sie daher zuerst alle Mitarbeiter.
Wenn Sie die Binärdatei im Repo für andere Personen verfügbar halten möchten, gibt es keine echte Möglichkeit, das zu tun, was Sie möchten. Es ist so ziemlich alles oder nichts.
quelle
Es stellte sich heraus, dass der Schlüssel für mich lief
git repack -A -d -f
und danngit gc
die Größe des einzelnen Git-Packs reduzierte, den ich hatte.quelle
Hy!
Git empfängt nur Objekte, die es beim Klonen von Repositorys tatsächlich benötigt (wenn ich es richtig verstehe)
Sie können also das letzte Commit ändern, indem Sie die versehentlich hinzugefügte Datei entfernen und Ihre Änderungen dann in das Remote-Repository übertragen (mit der Option -f, um das alte Commit auch auf dem Server zu überschreiben).
Wenn Sie dann einen neuen Klon dieses Repos erstellen, sollte das .git-Verzeichnis so klein sein wie vor dem Festschreiben der großen Datei (en).
Wenn Sie auch die unnötigen Dateien vom Server entfernen möchten, können Sie optional das Repository auf dem Server löschen und Ihre neu geklonte Kopie (mit dem vollständigen Verlauf) verschieben.
quelle
Siehe "Entfernen von Objekten" im Pro Git-Buch:
http://git-scm.com/book/en/Git-Internals-Maintenance-and-Data-Recovery#Removing-Objects
Update: siehe auch BFG Repo Cleaner: http://rtyley.github.io/bfg-repo-cleaner/
quelle
Denken
Filename
Sie daran, diejenige zu ändern, die Sie aus dem Repository entfernen möchten.quelle