2012-11-15 5 views
18

Ich muss den Repo kleiner machen. Ich glaube, ich kann es kleiner machen, indem problematische Binärdateien aus git Geschichte zu entfernen:Wie finde ich heraus, welche Dateien in git repo den meisten Platz einnehmen?

git filter-branch --index-filter 'git rm --cached --ignore-unmatch BigFile' 

Und dann die Objekte loslassen:

rm -rf .git/refs/original/ 
git reflog expire --expire=now --all 
git gc --aggressive --prune=now 

(. Fühlen Sie sich frei zu äußern, wenn diese Befehle falsch sind)

Das Problem: Wie identifiziere ich diese großen Dateien, so dass ich beurteilen kann, ob sie aus dem git-Verlauf entfernt werden? Wahrscheinlich sind sie in der Arbeits Baum nicht mehr - sie wurden gelöscht und wahrscheinlich auch untracked mit:

git rm --cached BigFile 

Antwort

17

Sie können die Hash-IDs der größten Objekte wie diese finden:

git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr 

Dann für einen bestimmten SHA, können Sie dies tun, um die Dateinamen zu erhalten:

git rev-list --all --objects | grep <SHA> 

nicht sicher, ob eine effizientere Art und Weise gibt, es zu tun. Wenn Sie sicher sind, dass alles in Pack-Dateien (nicht lose Objekte) ist, erzeugt git verify-pack -v Ausgabe, die die Größe enthält, und ich erinnere mich daran, irgendwo ein Skript zu sehen, das diese Ausgabe analysiert und jedes Objekt mit den Originaldateien abgleicht.

11

twalberg's answer macht den Trick. Ich wickelte es in einer Schleife, so dass Sie Dateien, um nach Größe auflisten:

while read -r largefile; do 
    echo $largefile | awk '{printf "%s %s ", $1, $3 ; system("git rev-list --all --objects | grep " $1 " | cut -d \" \" -f 2-")}' 
done <<< "$(git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr | head -n 20)" 

head -n 20 die Ausgabe in dem Top-20 ändern, falls erforderlich einschränkt.

Sobald Sie die Problemdateien identifiziert haben, finden Sie unter this Antwort für wie Sie sie entfernen.

+0

Viel bequemer - danke! – nealmcb

+0

Welche Einheiten haben die zurückgegebene Größe? –

+0

Ich glaube, das sind Bytes – MatrixManAtYrService

0

Ich schrieb ein Skript, das Ihnen die größten Objekte, Dateien oder Verzeichnisse in meiner Antwort here erzählt. Ohne Argumente sagt es Ihnen die Größe aller Objekte, sortiert nach Größe. Sie können es --sum oder sagen, um alle Objekte für jede Datei zu summieren und diese zu drucken oder das Gleiche für alle Dateien in jedem Verzeichnis zu tun. Ich hoffe es ist nützlich!

Verwandte Themen