git cat-file -s
gibt die Größe eines Objekts in Git in Byte aus. git diff-tree
kann Ihnen die Unterschiede zwischen einem Baum und einem anderen sagen.
Wenn Sie dies in einem Skript zusammenfassen, das git-file-size-diff
sich irgendwo auf Ihrem Pfad befindet, können Sie es aufrufen git file-size-diff <tree-ish> <tree-ish>
. Wir können so etwas wie das Folgende versuchen:
#!/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
}
Im Gebrauch sieht dies wie folgt aus:
$ 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
Durch die Verwendung git-rev-parse
sollten alle üblichen Methoden zum Festlegen von Festschreibungsbereichen akzeptiert werden.
BEARBEITEN: aktualisiert, um die kumulierte Summe aufzuzeichnen. Beachten Sie, dass bash das while-Lesen in einer Unterschale ausführt, daher die zusätzlichen geschweiften Klammern, um zu vermeiden, dass beim Verlassen der Unterschale die Summe verloren geht.
BEARBEITEN: Unterstützung für den Vergleich des Index mit einem anderen Baum hinzugefügt, indem stattdessen ein --cached
Argument zum Aufrufen git diff-index
verwendet wird git diff-tree
. z.B:
$ 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