88 votes

Git : afficher la différence de taille totale des fichiers entre deux commits ?

Est-il possible d'afficher la différence de taille totale des fichiers entre deux commits ? Quelque chose comme :

$ git file-size-diff 7f3219 bad418 # I wish this worked :)
-1234 bytes

J'ai essayé :

$ git diff --patch-with-stat

Et cela montre la différence de taille de fichier pour chaque binaire dans le diff - mais pas pour les fichiers texte, et pas la différence de taille totale du fichier.

Des idées ?

106voto

patthoyts Points 8978

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.

28voto

Adam Dymitruk Points 34999

Vous pouvez canaliser la sortie de

git show some-ref:some-path-to-file | wc -c
git show some-other-ref:some-path-to-file | wc -c

et comparez les 2 chiffres.

3voto

matthiaskrgr Points 31

J'ai fait un bash script pour comparer les branches/commits etc par taille réelle de fichier/contenu. Il peut être trouvé à https://github.com/matthiaskrgr/gitdiffbinstat et détecte également les renommages de fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X