Ich habe ein GitHub-Repo mit zwei Zweigen - Master & Release.
Der Release-Zweig enthielt binäre Distributionsdateien, die zu einer sehr großen Repo-Größe (> 250 MB) beitrugen. Deshalb habe ich beschlossen, die Dinge zu bereinigen.
Zuerst habe ich den Remote Release-Zweig über gelöscht git push origin :release
Dann habe ich den lokalen Release-Zweig gelöscht. Zuerst habe ich es versucht git branch -d release
, aber git sagte "Fehler: Der Zweig 'release' ist kein Vorfahr Ihres aktuellen HEAD." Das ist wahr, also habe ich es erzwungen git branch -D release
, um es zu löschen.
Aber meine Repository-Größe, sowohl lokal als auch auf GitHub, war immer noch riesig. Also ging ich die übliche Liste der Git-Befehle durch, git gc --prune=today --aggressive
ohne Glück.
Durch Befolgen der Anweisungen von Charles Bailey bei SO 1029969 konnte ich eine Liste der SHA1s für die größten Blobs erhalten. Ich habe dann das Skript von SO 460331 verwendet , um die Blobs zu finden ... und die fünf größten existieren nicht, obwohl kleinere Blobs gefunden werden, sodass ich weiß, dass das Skript funktioniert.
Ich denke, diese Blogs sind die Binärdateien aus dem Release-Zweig, und sie sind nach dem Löschen dieses Zweigs irgendwie herumgekommen. Was ist der richtige Weg, um sie loszuwerden?
Antworten:
... und ohne weiteres darf ich Ihnen diesen nützlichen Befehl "git-gc-all" vorstellen, der garantiert Ihren gesamten Git-Müll entfernt, bis zusätzliche Konfigurationsvariablen auftauchen:
Möglicherweise müssen Sie auch zuerst so etwas ausführen, oh je, git ist kompliziert !!
Möglicherweise müssen Sie auch einige Tags entfernen, danke Zitrax:
Ich habe das alles in ein Skript geschrieben: git-gc-all-ferocious .
quelle
objects
. Was sind das und warum sind sie (anscheinend) irrelevant?Wie hier beschrieben , verwenden Sie einfach , wenn Sie alles, auf das nur per Reflog verwiesen wird , dauerhaft entfernen möchten
git reflog expire --expire-unreachable=now --all
Entfernt alle Verweise auf nicht erreichbare Commits inreflog
.git gc --prune=now
entfernt die Commits selbst.Achtung : Nur die Verwendung
git gc --prune=now
funktioniert nicht, da auf diese Commits im Reflog noch verwiesen wird. Daher ist das Löschen des Reflogs obligatorisch. Beachten Sie auch, dass bei Verwendungrerere
zusätzliche Referenzen vorhanden sind, die von diesen Befehlen nicht gelöscht werden. Siehegit help rerere
für weitere Details. Darüber hinaus werden Commits, auf die von lokalen oder Remote-Zweigen oder -Tags verwiesen wird, nicht entfernt, da diese von git als wertvolle Daten betrachtet werden.quelle
git fetch --prune
Reduzieren Sie die Größe weiter, da lokale Blobs gelöscht werden.Wie in dieser SO-Antwort erwähnt ,
git gc
kann das Repo tatsächlich vergrößert werden!Siehe auch diesen Thread
Der gleiche Thread erwähnt :
Auf der Filter-Zweig-Front können Sie dieses Skript (mit Vorsicht) betrachten
quelle
filter-branch
Befehlsverwendung.git gc --prune=now
oder niedriges Niveaugit prune --expire now
.quelle
Jedes Mal, wenn sich Ihr KOPF bewegt, verfolgt Git dies in der
reflog
. Wenn Sie Commits entfernt haben, haben Sie immer noch "baumelnde Commits", da diese nochreflog
ca. 30 Tage lang von den referenziert werden . Dies ist das Sicherheitsnetz, wenn Sie Commits versehentlich löschen.Sie können den
git reflog
Befehl zum Entfernen bestimmter Commits, zum Umpacken usw. oder nur den Befehl auf hoher Ebene verwenden:quelle
Sie können verwenden
git forget-blob
.Die Verwendung ist ziemlich einfach
git forget-blob file-to-forget
. Weitere Informationen erhalten Sie hierhttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Es verschwindet aus allen Commits in Ihrem Verlauf, Reflog, Tags und so weiter
Hin und wieder stoße ich auf das gleiche Problem, und jedes Mal, wenn ich auf diesen und andere Beiträge zurückkommen muss, habe ich den Prozess automatisiert.
Credits für Mitwirkende wie Sam Watkins
quelle
Versuchen Sie, git-filter-branch zu verwenden - es werden keine großen Blobs entfernt, aber es können große Dateien, die Sie angeben, aus dem gesamten Repo entfernt werden. Für mich reduziert es die Repo-Größe von Hunderten MB auf 12 MB.
quelle
Manchmal ist der Grund, warum "gc" nicht viel bringt, dass es eine unvollendete Rebase oder einen unvollendeten Stash gibt, der auf einem alten Commit basiert.
quelle
Um eine weitere Spitze hinzuzufügen, vergessen Sie nicht verwenden git remote Prune die veralteten Zweige Ihrer Fernbedienungen zu löschen , bevor Sie git gc
Sie können sie mit Git Branch -a sehen
Es ist oft nützlich, wenn Sie von Github- und Forked-Repositories abrufen ...
quelle
Bevor Sie
git filter-branch
und tungit gc
, sollten Sie Tags überprüfen, die in Ihrem Repo vorhanden sind. Jedes echte System, das über automatische Tagging-Funktionen für die kontinuierliche Integration und Bereitstellung verfügt, führt dazu, dass unerwünschte Objekte immer noch von diesen Tags referenziert werden. Dahergc
können sie nicht entfernt werden, und Sie werden sich immer wieder fragen, warum das Repo immer noch so groß ist.Der beste Weg, um alle unerwünschten Dinge loszuwerden, ist zu rennen
git-filter
undgit gc
dann schiebt Master auf einen neuen nackten Repo. Das neue nackte Repo wird den aufgeräumten Baum haben.quelle