trova il commit grasso

È ansible ottenere informazioni su quanto spazio viene sprecato dalle modifiche in ogni commit, così posso trovare commit che aggiungono grandi file o molti file. Questo è tutto per cercare di ridurre le dimensioni del repository git (rebasing e forse il filtring commit)

Potresti fare questo:

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

Questo mostrerà i file più grandi in basso (la quarta colonna è la dimensione del file (blob).

Se hai bisogno di guardare diversi rami, ti consigliamo di cambiare HEAD con i nomi di quei rami. Oppure, metti questo in loop su rami, tag o revs a cui sei interessato.

Ho dimenticato di rispondere, la mia risposta è:

 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 

Tutte le soluzioni fornite qui si concentrano sulle dimensioni dei file, ma la domanda iniziale era relativa alle dimensioni dei commit , che a mio parere, e nel mio caso, era più importante da trovare (perché quello che volevo è eliminare molti piccoli binari introdotto in un singolo commit, che sumto contava un sacco di dimensioni, ma di piccole dimensioni se misurate singolarmente per file).

Una soluzione che si concentra sulle dimensioni di commit è fornita qui , che è questo 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` ; # } } 

E che chiamo così:

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

git fat find N dove N è in byte restituirà tutti i file nell’intera cronologia che sono più grandi di N byte.

Puoi saperne di più su git-fat qui: https://github.com/cyaninc/git-fat

Personalmente, ho trovato questa risposta molto utile quando si cercava di trovare file di grandi dimensioni nella cronologia di un repository git: trovare file in repository git su x megabyte, che non esistono in HEAD

git cat-file -s dove può riferirsi a un commit, blob, albero o tag.

 #!/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