83

2 つのコミット間の合計ファイル サイズの違いを表示することは可能ですか? 何かのようなもの:

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

私はもう試した:

$ git diff --patch-with-stat

これは、差分内の各バイナリファイルのファイル サイズの違いを示していますが、テキスト ファイルではなく、合計ファイル サイズの違いではありません。

何か案は?

4

5 に答える 5

97

git cat-file -sgit のオブジェクトのサイズをバイト単位で出力します。git diff-treeある木と別の木の違いを教えてくれます。

git-file-size-diffこれをPATH のどこかにあるというスクリプトにまとめると、 を呼び出すことができますgit file-size-diff <tree-ish> <tree-ish>。次のようなことを試すことができます。

#!/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
}

使用中、これは次のようになります。

$ 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

これを使用git-rev-parseすることで、コミット範囲を指定するすべての通常の方法を受け入れる必要があります。

編集:累積合計を記録するように更新されました。bash はサブシェルで while read を実行することに注意してください。そのため、サブシェルの終了時に合計が失われないように中括弧が追加されています。

編集: の代わりに--cached呼び出す引数を使用して、インデックスを別のツリーっぽいものと比較するためのサポートを追加しました。例えば:git diff-indexgit diff-tree

$ 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
于 2012-06-01T08:54:13.657 に答える
26

の出力をパイプできます

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

2 つの数値を比較します。

于 2012-06-01T06:18:40.583 に答える
3

ブランチ/コミットなどを実際のファイル/コンテンツサイズで比較するbashスクリプトを作成しました。https://github.com/matthiaskrgr/gitdiffbinstatで見つけることができ、ファイルの名前変更も検出します。

于 2012-12-29T01:41:11.413 に答える
2

スクリプトへのコメント: git-file-size-diff、patthoyts によって提案されました。このスクリプトは非常に便利ですが、次の 2 つの問題が見つかりました。

  1. 誰かがファイルのパーミッションを変更すると、git は case ステートメントで別のタイプを返します。

    T) echo >&2 "Skipping change of type"
    continue ;;
    
  2. sha-1 値が (なんらかの理由で) もう存在しない場合、スクリプトはクラッシュします。ファイル サイズを取得する前に、sha を検証する必要があります。

    $(git cat-file -e $D) if [ "$?" = 1 ]; then continue; fi

完全な case ステートメントは次のようになります。

case $M in
      M) $(git cat-file -e $D)
         if [ "$?" = 1 ]; then continue; fi
         $(git cat-file -e $C)
         if [ "$?" = 1 ]; then continue; fi
         bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;;
      A) $(git cat-file -e $D)
         if [ "$?" = 1 ]; then continue; fi
         bytes=$(git cat-file -s $D) ;;
      D) $(git cat-file -e $C)
         if [ "$?" = 1 ]; then continue; fi
         bytes=-$(git cat-file -s $C) ;;
      T) echo >&2 "Skipping change of type"
         continue ;;
      *)
        echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\"
        continue
        ;;
    esac
于 2017-06-22T09:40:06.667 に答える