git cat-file -s
donnera la taille en octets d'un objet dans git. git diff-tree
peut vous indiquer les différences entre un arbre et un autre. En rassemblant tout cela dans un script appelé git-file-size-diff situé quelque part dans votre PATH, vous aurez la possibilité d'appeler git file-size-diff <tree-ish> <tree-ish>
. En mettant tout cela ensemble, nous pouvons essayer quelque chose comme ce qui suit :
#!/bin/sh
. git-sh-setup
args=$(git rev-parse --sq "$@")
eval "git diff-tree -r $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 pratique, cela ressemble à ce qui suit :
$ 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
En utilisant git-rev-parse
il devrait accepter toutes les manières habituelles de spécifier les plages de livraison.
EDIT : mis à jour pour enregistrer le total cumulé. Notez que bash exécute le while read dans un sous-shell, d'où les accolades supplémentaires pour éviter de perdre le total lorsque le sous-shell sort.