2009-08-17 15 views
44

Ist es möglich, Informationen darüber zu erhalten, wie viel Speicherplatz durch Änderungen in jedem Commit verschwendet wird - so kann ich Commits finden, die große Dateien oder viele Dateien hinzugefügt haben. Dies ist alles zu versuchen, git Repo Größe (Rebasing und vielleicht Filter Commits)git find fat commit

+1

einfach Erwägen Sie 'git gc' gelegentlich , möglicherweise als "git gc --aggressive" – Hasturkun

+0

'git gc' (und' git gc --prune'); '--aggresive' kann sogar schlechtere Ergebnisse liefern (sollte aber normalerweise nicht) und ist es normalerweise nicht wert. –

+0

Diese Antwort ist viel besser: http://stackoverflow.com/a/10847242/520567 – akostadinov

Antwort

16

antworten vergessen zu, meine Antwort ist:

git rev-list --all --pretty=format:'%H%n%an%n%s' # get all commits 
git diff-tree -r -c -M -C --no-commit-id #{sha}  # get new blobs for each commit 
git cat-file --batch-check << blob ids    # get size of each blob 
+1

@sschuberth: Wenn ich Ihr Skript richtig gelesen, berücksichtigt es nur Dateien, die _added_ in einem bestimmten Commit waren. Es wird nicht erkannt, wenn eine Datei bei einem Commit wesentlich angewachsen ist. – kynan

+0

@kynan: Du hast Recht, denn das hat das OP verlangt (und was ich gebraucht habe). Es ist jedoch einfach, das Skript so zu ändern, dass geänderte Dateien erkannt werden: Im Prinzip müssen Sie im Grep-Aufruf nur "A" durch "M" ersetzen. Dadurch wird die Gesamtdateigröße nach der Änderung gemeldet (nicht die Anzahl der hinzugefügten/entfernten Bytes). Ich würde gerne eine Pull-Anfrage auf GitHub akzeptieren, um das Skript generischer zu machen. – sschuberth

+7

Unterbrochener Link, das Skript befindet sich jetzt [hier] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke

1

git cat-file -s <object> wo <object> kann beziehen sich auf eine Festschreibung, Blob, Baum oder Tag.

21

Sie können dies tun:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4 

Dadurch werden die größten Dateien auf der Unterseite zeigen (vierte Spalte ist die Datei (Klecks) Größe

Wenn Sie an verschiedenen Zweigen suchen müssen Sie‘. .. ll will HEAD zu diesem Zweig Namen ändern oder diese über die Zweige, Tags in einer Schleife setzen oder Drehzahlen Sie interessiert sind

1
#!/bin/bash 
COMMITSHA=$1 

CURRENTSIZE=$(git ls-tree -lrt $COMMITSHA | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc) 
PREVSIZE=$(git ls-tree -lrt $COMMITSHA^ | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc) 
echo "$CURRENTSIZE - $PREVSIZE" | bc 
+0

Und ich schlage vor, git format-patch zu verwenden, um commit-Größe zu erhalten (es wird einige zusätzliche Größe für E-Mail-Header, aber tatsächlich, wenn Sie schnell Commit benötigen ist nicht zu groß - es ist nicht so wichtig um genaue Größe zu erhalten, wird + - 1K eine gute Genauigkeit sein) –

2

git fat find N wobei N in Bytes wird wieder alle Dateien im gesamten Geschichte, die größer als N Bytes sind.

Sie können hier mehr über git-Fett herausfinden: https://github.com/cyaninc/git-fat

+0

Bummer. Ich habe es auf der Git Shell für Windows ausprobiert, die mit GitHub Desktop geliefert wird, und der Befehl hat nicht funktioniert und gab mir einen Fehler. – DucRP

3

Alle Lösungen hier bereitgestellten konzentrieren sich auf Dateigrößen aber die ursprüngliche Frage gestellt war etwa Größen begehen, die meiner Meinung nach, und In meinem Fall war es wichtiger zu finden (weil, was ich wollte, ist, viele kleine Binärdateien loszuwerden, die in einem einzigen Commit eingeführt wurden, was zusammenfassend viel Größe bedeutet, aber eine kleine Größe, wenn sie einzeln durch Datei gemessen wird).

Eine Lösung, die Größen auf verpflichten konzentriert sich die here vorgesehen ist, die das Perl-Skript ist:

#!/usr/bin/perl 
foreach my $rev (`git rev-list --all --pretty=oneline`) { 
    my $tot = 0; 
    ($sha = $rev) =~ s/\s.*$//; 
    foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) { 
    $blob = (split /\s/, $blob)[3]; 
    next if $blob == "0000000000000000000000000000000000000000"; # Deleted 
    my $size = `echo $blob | git cat-file --batch-check`; 
    $size = (split /\s/, $size)[2]; 
    $tot += int($size); 
    } 
    my $revn = substr($rev, 0, 40); 
# if ($tot > 1000000) { 
    print "$tot $revn " . `git show --pretty="format:" --name-only $revn | wc -l` ; 
# } 
} 

Und was ich so nennen:

./git-commit-sizes.pl | sort -n -k 1