Ich habe ein 300 MB Git Repo. Die Gesamtgröße meiner aktuell ausgecheckten Dateien beträgt 2 MB, und die Gesamtgröße des restlichen Git-Repos beträgt 298 MB. Dies ist im Grunde ein reines Code-Repo, das nicht mehr als ein paar MB groß sein sollte.
Ich vermute, jemand hat versehentlich einige große Dateien (Videos, Bilder usw.) festgeschrieben und sie dann entfernt ... aber nicht von git, sodass der Verlauf immer noch nutzlose große Dateien enthält. Wie kann man die großen Dateien im Git-Verlauf finden? Es gibt mehr als 400 Commits, daher ist es nicht praktikabel, einzeln zu arbeiten.
HINWEIS : meine Frage geht es nicht darum , wie die Datei zu entfernen , aber wie man findet es in erster Linie.
Antworten:
Ich fand dieses Skript in der Vergangenheit sehr nützlich, um große (und nicht offensichtliche) Objekte in einem Git-Repository zu finden:
Das gibt Ihnen den Objektnamen (SHA1sum) des Blobs, und dann können Sie ein Skript wie dieses verwenden:
... um das Commit zu finden, das auf jeden dieser Blobs verweist.
quelle
🚀 Ein blitzschneller Shell-Einzeiler 🚀
Dieses Shell-Skript zeigt alle Blob-Objekte im Repository an, sortiert vom kleinsten zum größten.
Für mein Beispiel-Repo lief es ungefähr 100-mal schneller als die anderen hier gefundenen.
Auf meinem vertrauenswürdigen Athlon II X4-System verwaltet es das Linux-Kernel-Repository mit seinen 5,6 Millionen Objekten in etwas mehr als einer Minute .
Das Basisskript
Wenn Sie den obigen Code ausführen, erhalten Sie eine schöne, für Menschen lesbare Ausgabe wie folgt :
macOS-Benutzer : Da
numfmt
es unter macOS nicht verfügbar ist, können Sie entweder die letzte Zeile weglassen und sich mit Rohbyte-Größen befassen oderbrew install coreutils
.Filtern
Fügen Sie vor der
sort
Zeile eine der folgenden Zeilen ein, um eine weitere Filterung zu erzielen .Zum Ausschließen von Dateien , die in vorhanden sind
HEAD
, fügen Sie die folgende Zeile ein :Zum zeigen nur Dateien gegebene Größe übersteigt (zB 1 MiB = 2 20 B), fügen Sie die folgende Zeile ein :
Ausgabe für Computer
Lassen Sie die letzten beiden Zeilen des Basisskripts weg, um eine Ausgabe zu generieren, die für die weitere Verarbeitung durch Computer besser geeignet ist . Sie übernehmen die gesamte Formatierung. Damit haben Sie ungefähr Folgendes:
Datei entfernen
Informationen zum eigentlichen Entfernen von Dateien finden Sie in dieser SO-Frage zum Thema .
quelle
brew install coreutils
und ersetzen Sie danncut
mitgcut
undnumfmt
mitgnumfmt
.git large
jemand?Ich habe eine einzeilige Lösung auf der Wiki-Seite des Fachbereichs Physik der ETH Zürich gefunden (am Ende dieser Seite). Machen Sie einfach einen
git gc
, um abgestandenen Müll zu entfernen, und danngibt Ihnen die 10 größten Dateien im Repository.
Es gibt auch eine faule Lösung jetzt verfügbar, GitExtensions jetzt ein Plugin hat , die diese in UI funktioniert (und Griffe Geschichte neu geschrieben als auch).
quelle
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Schritt 1 Schreiben Sie alle Datei-SHA1s in eine Textdatei:
Schritt 2 Sortieren Sie die Blobs vom größten zum kleinsten und schreiben Sie die Ergebnisse in die Textdatei:
Schritt 3a Kombinieren Sie beide Textdateien, um Informationen zum Dateinamen / sha1 / Größe zu erhalten:
Schritt 3b Wenn Sie Dateinamen oder Pfadnamen haben, die Leerzeichen enthalten , versuchen Sie diese Variante von Schritt 3a. Es verwendet
cut
anstelle von verwendetawk
, um die gewünschten Spalten inkl. Leerzeichen von Spalte 7 bis Zeilenende:Jetzt können Sie sich die Datei bigtosmall.txt ansehen, um zu entscheiden, welche Dateien Sie aus Ihrem Git-Verlauf entfernen möchten.
Schritt 4 So führen Sie das Entfernen durch (beachten Sie, dass dieser Teil langsam ist, da jedes Commit in Ihrem Verlauf auf Daten zu der von Ihnen identifizierten Datei überprüft wird):
Quelle
Die Schritte 1 bis 3a wurden aus Suchen und Löschen großer Dateien aus dem Git-Verlauf kopiert
BEARBEITEN
Der Artikel wurde irgendwann in der zweiten Jahreshälfte 2017 gelöscht, aber auf eine archivierte Kopie davon kann weiterhin mit der Wayback-Maschine zugegriffen werden .
quelle
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Beachten Sie, dass Sie das tatsächliche TAB-Zeichen nachherjoin -t'
mit STRG + V <TAB> per geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html eingeben müssen$'\t'
sollte Ihnen einen Tab geben.echo -n $'\t' | xxd -ps
->09
Sie sollten BFG Repo-Cleaner verwenden .
Laut der Website:
Das klassische Verfahren zum Reduzieren der Größe eines Repositorys wäre:
quelle
--strip-biggest-blobs 500
dasWenn Sie nur eine Liste großer Dateien haben möchten, möchte ich Ihnen den folgenden Einzeiler zur Verfügung stellen:
Wessen Ausgabe wird sein:
Der letzte Eintrag in der Liste zeigt auf die größte Datei in Ihrem Git-Verlauf.
Mit dieser Ausgabe können Sie sicherstellen, dass Sie keine Inhalte mit BFG löschen, die Sie in Ihrem Verlauf benötigt hätten.
quelle
1.1, 1.2, 2.3
Zahlen?<filenumber>.<field>
die Reihenfolge der Kombination angegeben ist. Weitere Informationen finden Sie unter man.cx/join .Wenn Sie unter Windows arbeiten, finden Sie hier ein PowerShell-Skript, mit dem die 10 größten Dateien in Ihrem Repository gedruckt werden:
quelle
You cannot call a method on a null-valued expression. At line: 2 char: 1
. Diese Antwort funktionierte jedoch: stackoverflow.com/a/57793716/2441655 (es ist auch kürzer)Versuchen Sie es
git ls-files | xargs du -hs --threshold=1M
.Wir verwenden den folgenden Befehl in unserer CI-Pipeline. Er wird angehalten, wenn große Dateien im Git-Repo gefunden werden:
quelle
Ich konnte die beliebteste Antwort nicht verwenden, da der
--batch-check
Befehlszeilenwechsel zu Git 1.8.3 (den ich verwenden muss) keine Argumente akzeptiert. Die folgenden Schritte wurden unter CentOS 6.5 mit Bash 4.1.2 ausprobiertSchlüssel Konzepte
In Git der Begriff Blob impliziert den Inhalt einer Datei. Beachten Sie, dass ein Commit möglicherweise den Inhalt einer Datei oder eines Pfadnamens ändert. Daher kann dieselbe Datei je nach Festschreiben auf einen anderen Blob verweisen. Eine bestimmte Datei kann in einem Commit die größte in der Verzeichnishierarchie sein, in einem anderen jedoch nicht. Die Frage, große Commits anstelle großer Dateien zu finden, bringt die Sache daher in die richtige Perspektive.
Für den Ungeduldigen
Der Befehl zum Drucken der Liste der Blobs in absteigender Reihenfolge der Größe lautet:
Beispielausgabe:
Verwenden Sie zum Entfernen solcher Blobs den BFG Repo Cleaner , wie in anderen Antworten erwähnt. Bei einer Datei
blobs.txt
, die nur die Blob-Hashes enthält, zum Beispiel:Tun:
Die Frage ist, wie man die Commits findet, was mehr Arbeit ist als das Finden von Blobs. Um es zu wissen, lesen Sie bitte weiter.
Weitere Arbeit
Bei einem Commit-Hash lautet ein Befehl, der Hashes aller damit verbundenen Objekte, einschließlich Blobs, druckt:
Wenn also solche Ausgaben für alle Commits im Repo verfügbar sind und ein Blob-Hash vorliegt, stimmen die Commits mit den Ausgaben überein. Diese Idee ist im folgenden Skript codiert:
Wenn der Inhalt in einer Datei mit dem Namen gespeichert wird, lautet
find-commits.sh
ein typischer Aufruf wie folgt:Wie zuvor
blobs.txt
listet die Datei Blob-Hashes auf, einen pro Zeile. Diecreate_db()
Funktion speichert einen Cache aller Festschreibungslisten in einem Unterverzeichnis im aktuellen Verzeichnis.Einige Statistiken aus meinen Experimenten mit einem System mit zwei Intel (R) Xeon (R) CPU E5-2620 2,00-GHz-Prozessoren, die vom Betriebssystem als 24 virtuelle Kerne dargestellt werden:
Beachten Sie, dass das Skript Single-Threaded ist. Daher wird immer nur ein Kern verwendet.
quelle
Powershell-Lösung für Windows Git, finden Sie die größten Dateien:
quelle
Beginnen Sie mit der Analyse, Validierung und Auswahl der Grundursache. Verwenden Sie
git-repo-analysis
, um zu helfen.Möglicherweise finden Sie auch einen gewissen Wert in den detaillierten Berichten, die von BFG Repo-Cleaner erstellt wurden und die sehr schnell ausgeführt werden können, indem Sie mit ihrem Netzwerkdurchsatz von 10 MB / s auf ein Digital Ocean-Tröpfchen klonen.
quelle
Ich bin aus dem gleichen Grund wie jeder andere darüber gestolpert. Aber die zitierten Skripte haben bei mir nicht ganz funktioniert. Ich habe eine gemacht, die eher eine Mischung aus denen ist, die ich gesehen habe, und sie lebt jetzt hier - https://gitlab.com/inorton/git-size-calc
quelle