reports - git encontrar grasa cometer
git stats (7)
¿Es posible obtener información sobre cuánto espacio se desperdicia con los cambios en cada confirmación? Así puedo encontrar confirmaciones que agreguen archivos grandes o muchos archivos. Todo esto es para tratar de reducir el tamaño del repositorio de git (rebasar y tal vez filtrar las confirmaciones)
Olvidé responder, mi respuesta es:
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
Personalmente, encontré que esta respuesta era la más útil cuando intentaba encontrar archivos grandes en el historial de un repositorio git: encontrar archivos en un repositorio git sobre x megabytes, que no existen en HEAD
Podrías hacer esto:
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
Esto mostrará los archivos más grandes en la parte inferior (la cuarta columna es el tamaño del archivo (blob).
Si necesita buscar en diferentes sucursales, querrá cambiar HEAD a los nombres de esas sucursales. O bien, ponga esto en un bucle sobre las ramas, etiquetas o revoluciones que le interesen.
Todas las soluciones proporcionadas aquí se centran en el tamaño de los archivos, pero la pregunta original fue sobre el tamaño de los comités , que en mi opinión, y en mi caso, fue más importante encontrar (porque lo que quería era deshacerme de muchos binarios pequeños). introducido en un solo compromiso, que se resumió representó una gran cantidad de tamaño, pero tamaño pequeño si se mide individualmente por archivo).
here proporciona una solución que se centra en los tamaños de compromiso, que es este script de 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` ;
# }
}
Y a la que llamo así:
./git-commit-sizes.pl | sort -n -k 1
git cat-file -s <object>
donde <object>
puede referirse a un commit, blob, tree o tag.
git fat find N
donde N está en bytes devolverá todos los archivos de todo el historial, que son más grandes que N bytes.
Puede encontrar más información sobre git-fat aquí: https://github.com/cyaninc/git-fat
#!/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