2009-08-17 10 views
44

Est-il possible d'obtenir des informations sur la quantité d'espace gaspillée par les changements dans chaque commit - donc je peux trouver des commits qui ont ajouté de gros fichiers ou beaucoup de fichiers. Tout ceci pour tenter de réduire la taille du repo git (rebasing et éventuellement filtrage des validations)git find fat commit

+1

Il suffit de considérer en cours d'exécution 'gc' git de temps en temps , éventuellement en tant que 'git gc --aggressive' – Hasturkun

+0

' git gc' (et 'git gc --prune'); '--aggresive' peut même donner des résultats plus mauvais (mais ne devrait normalement pas l'être), et ne vaut généralement pas le coup. –

+0

Cette réponse est beaucoup mieux: http://stackoverflow.com/a/10847242/520567 – akostadinov

Répondre

16

oublié de répondre, ma réponse est:

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: Si je lis votre script correctement, il ne prend en compte que les fichiers qui ont été _added_ dans un commit particulier. Il ne détectera pas quand un fichier a considérablement augmenté dans un commit. – kynan

+0

@kynan: Vous avez raison, car c'est ce que l'OP a demandé (et ce dont j'avais besoin). Mais il est facile de changer le script pour détecter les fichiers modifiés: vous devez simplement remplacer "A" par "M" dans l'appel grep. Cela indiquera la taille totale du fichier après la modification (pas le nombre d'octets ajoutés/supprimés). J'accepterais volontiers une requête pull sur GitHub pour rendre le script plus générique. – sschuberth

+7

Lien brisé, le script est maintenant situé [ici] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke

1

git cat-file -s <object><object> peut faire référence à un commit, un blob, un arbre ou un tag.

21

Vous pouvez le faire:

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

Cela montrera les plus gros fichiers en bas (quatrième colonne est le fichier (blob) Taille

Si vous avez besoin de regarder les différentes branches vous. .. ll veulent changer HEAD ces noms de branche ou, mettez cela dans une boucle sur les branches, les balises, ou revs vous êtes intéressé par

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

Et aussi je suggère d'utiliser git format-patch pour obtenir la taille de commit (il y aura une taille supplémentaire pour l'en-tête mail, mais en fait si vous avez besoin d'un commit rapide pour obtenir la taille exacte, + - 1K sera une bonne précision) –

2

git fat find N où N est en octets retournera tous les fichiers dans l'ensemble l'histoire qui sont plus grandes que N octets.

Vous pouvez en savoir plus sur teneur en matières grasses git ici: https://github.com/cyaninc/git-fat

+0

Bummer. Je l'ai essayé sur Git Shell pour Windows qui vient avec GitHub Desktop et la commande n'a pas fonctionné, me donnant une erreur. – DucRP

3

Toutes les solutions proposées se concentrent ici sur taille des fichiers mais la question initiale posée était sur le point commettras tailles, qui, à mon avis, et dans mon cas, il était plus important de trouver (parce que ce que je voulais, c'est de se débarrasser de beaucoup de petits binaires introduits dans un seul commit, ce qui représentait beaucoup de taille, mais de petite taille si mesuré individuellement par fichier).

Une solution qui met l'accent lors de la validation des tailles est la condition here, qui est ce script perl:

#!/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` ; 
# } 
} 

Et que j'appelle comme ceci:

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