113 Stimmen

Wie entfernt man unbenutzte Objekte aus einem Git-Repository?

Ich habe versehentlich eine riesige Binärdatei mit meinem allerletzten Commit zu einem Git-Repository hinzugefügt, committed und gepusht.

Wie kann ich Git dazu bringen, das/die Objekt(e) zu entfernen, das/die für diesen Commit erstellt wurde(n), damit meine .git Verzeichnis wieder auf eine vernünftige Größe schrumpft?

bearbeiten : Danke für Ihre Antworten; ich habe mehrere Lösungen ausprobiert. Keine hat funktioniert. Zum Beispiel hat die von GitHub die Dateien aus dem Verlauf entfernt, aber die .git Die Größe des Verzeichnisses 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 :-(

7voto

u-foka Punkte 657

Hy!

Git erhält nur Objekte, die es beim Klonen von Repositories tatsächlich benötigt (wenn ich es richtig verstehe)

Sie können also den letzten Commit ändern, indem Sie die versehentlich hinzugefügte Datei entfernen, und dann Ihre Änderungen in das entfernte Repository pushen (mit der Option -f, um auch den alten Commit auf dem Server zu überschreiben)

Wenn Sie dann einen neuen Klon dieser Projektgruppe erstellen, sollte das Git-Verzeichnis so klein sein wie vor dem Commit der großen Datei(en).

Wenn Sie auch die überflüssigen Dateien vom Server entfernen möchten, können Sie das Projektarchiv auf dem Server löschen und Ihre neu geklonte Kopie (mit dem vollständigen Verlauf) pushen

5voto

Martin Punkte 10926
git filter-branch --index-filter 'git rm --cached --ignore-unmatch Filename' --prune-empty -- --all

Vergessen Sie nicht zu wechseln Filename für die Datei, die Sie aus dem Repository entfernen möchten.

5voto

Czarek Tomczak Punkte 18811

Siehe "Entfernen von Objekten" im Buch Pro Git:

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/

0voto

user2465896 Punkte 183

Im Jahr 2020 wird die Dokumentation für git-filter-branch rät von seiner Verwendung ab und empfiehlt die Verwendung einer Alternative wie git-filter-repo . Es kann auch verwendet werden anstelle von BFG .

Beachten Sie, dass das Kapitel über Geschichte neu schreiben im Git-Buch wurde nicht aktualisiert. Weder hat GitHub's Empfehlung zur Entfernung sensibler Daten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X