git cat-file -s
generará el tamaño en bytes de un objeto en git. git diff-tree
puede decirte las diferencias entre un árbol y otro.
Poner esto junto en un script llamado git-file-size-diff
ubicado en algún lugar de su PATH le dará la capacidad de llamar git file-size-diff <tree-ish> <tree-ish>
. Podemos probar algo como lo siguiente:
#!/bin/bash
USAGE='[--cached] [<rev-list-options>...]
Show file size changes between two commits or the index and a commit.'
. "$(git --exec-path)/git-sh-setup"
args=$(git rev-parse --sq "$@")
[ -n "$args" ] || usage
cmd="diff-tree -r"
[[ $args =~ "--cached" ]] && cmd="diff-index"
eval "git $cmd $args" | {
total=0
while read A B C D M P
do
case $M in
M) bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;;
A) bytes=$(git cat-file -s $D) ;;
D) bytes=-$(git cat-file -s $C) ;;
*)
echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\"
continue
;;
esac
total=$(( $total + $bytes ))
printf '%d\t%s\n' $bytes "$P"
done
echo total $total
}
En uso, esto se parece a lo siguiente:
$ git file-size-diff HEAD~850..HEAD~845
-234 Documentation/RelNotes/1.7.7.txt
112 Documentation/git.txt
-4 GIT-VERSION-GEN
43 builtin/grep.c
42 diff-lib.c
594 git-rebase--interactive.sh
381 t/t3404-rebase-interactive.sh
114 t/test-lib.sh
743 tree-walk.c
28 tree-walk.h
67 unpack-trees.c
28 unpack-trees.h
total 1914
Al usarlo git-rev-parse
, debería aceptar todas las formas habituales de especificar rangos de confirmación.
EDITAR: actualizado para registrar el total acumulado. Tenga en cuenta que bash ejecuta la lectura while en una subcapa, de ahí las llaves adicionales para evitar perder el total cuando la subcapa sale.
EDITAR: soporte agregado para comparar el índice con otro árbol usando un --cached
argumento para llamar en git diff-index
lugar de git diff-tree
. p.ej:
$ git file-size-diff --cached master
-570 Makefile
-134 git-gui.sh
-1 lib/browser.tcl
931 lib/commit.tcl
18 lib/index.tcl
total 244