混帐:显示两次提交之间的总文件大小区别?(Git: show total file size dif

2019-06-25 01:14发布

是否有可能显示两次提交的文件总大小的区别? 就像是:

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

我试过了:

$ git diff --patch-with-stat

这显示了在差异中每个二进制文件的文件大小差异-而不是文本文件,而不是总文件大小的差异。

有任何想法吗?

Answer 1:

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它应该接受指定承诺范围的所有常见的方式。

编辑:更新记录的累计。 需要注意的是bash的运行,而在子shell读取,因此额外的花括号以避免总丢失的子shell退出时。

编辑:对于通过使用针对另一棵树十岁上下的指数比较,增加了支持--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


Answer 2:

你可以管放出来的

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

并比较2号。



Answer 3:

我做了一个bash脚本来比较分支的实际文件/内容大小/提交等。 它可以被发现在https://github.com/matthiaskrgr/gitdiffbinstat并且还检测文件重命名。



Answer 4:

扩大对matthiaskrgr的回答 , https://github.com/matthiaskrgr/gitdiffbinstat可以像使用其他脚本:

gitdiffbinstat.sh HEAD..HEAD~4

伊莫它真的效果很好,速度远远超过任何其他在这里发布。 输出示例:

$ gitdiffbinstat.sh HEAD~6..HEAD~7
 HEAD~6..HEAD~7
 704a8b56161d8c69bfaf0c3e6be27a68f27453a6..40a8563d082143d81e622c675de1ea46db706f22
 Recursively getting stat for path "./c/data/gitrepo" from repo root......
 105 files changed in total
  3 text files changed, 16 insertions(+), 16 deletions(-) => [±0 lines]
  102 binary files changed 40374331 b (38 Mb) -> 39000258 b (37 Mb) => [-1374073 b (-1 Mb)]
   0 binary files added, 3 binary files removed, 99 binary files modified => [-3 files]
    0 b  added in new files, 777588 b (759 kb) removed => [-777588 b (-759 kb)]
    file modifications: 39596743 b (37 Mb) -> 39000258 b (37 Mb) => [-596485 b (-582 kb)]
    / ==>  [-1374073 b (-1 Mb)]

输出目录是质朴与./c/data ...如/ C实际上是filesytem根。



Answer 5:

该脚本注释:混帐文件大小差异,通过patthoyts建议。 剧本是非常有用的,但是,我发现两个问题:

  1. 当有人更改文件权限,混帐返回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


文章来源: Git: show total file size difference between two commits?