1. ホーム
  2. git

[解決済み] Git: 2つのコミット間のファイルサイズ差分を表示する?

2023-07-18 16:59:21

質問

2 つのコミット間のファイルサイズの差を表示することはできますか? 以下のようなものです。

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

試してみました。

$ git diff --patch-with-stat

そして、それぞれのファイルサイズの違いを示しています。 バイナリ の各ファイルのファイル サイズの違いを表示します。

何かアイデアはありますか?

どのように解決するのですか?

git cat-file -s は、gitにあるオブジェクトのサイズをバイト単位で出力します。 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 を使うことで、コミット範囲を指定するすべての通常の方法を受け入れることができるはずです。

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

EDIT: 別のツリーに対するインデックスを比較するためのサポートを追加しました。 --cached を呼び出すための引数 git diff-index の代わりに git 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