git cat-file -sgenerará el tamaño en bytes de un objeto en git. git diff-treepuede decirte las diferencias entre un árbol y otro.
Poner esto junto en un script llamado git-file-size-diffubicado 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 --cachedargumento para llamar en git diff-indexlugar 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