获取已删除行的大小

时间:2016-01-09 23:26:44

标签: git git-diff

考虑这个脚本:

mik() {
  nov=
  while [ $((nov+=1)) -le $1 ]
  do
    echo $RANDOM
  done
}
mik 200 > osc.txt
git add .
git commit -m pap
{
  head -100 osc.txt
  mik 50
} > que.txt
mv que.txt osc.txt

这将提交一个包含200个随机行的文件,然后删除最后100行,然后添加 50个新随机线。我想得到删除行的字节大小。 我试过这个命令:

$ git diff-index --numstat @
50      100     osc.txt

然而,它只显示添加和删除的行数,而不是字节。

3 个答案:

答案 0 :(得分:4)

sed的:

git diff | sed '/^i/N;s/^-//;t;d' | wc -c

AWK:

git diff | awk '/^i/{getline;next}/^-/{q+=length}END{print q}'
  1. 打印差异

  2. 过滤掉---

  3. 过滤掉已删除的行

  4. 删除开头-

  5. 计算总字节数

答案 1 :(得分:1)

git diff @ osc.txt | git apply --no-add --cached

仅适用于您对工作树副本所做的删除,并且仅适用于索引状态,因此您可以

git cat-file -s @:osc.txt  # size of committed version
git cat-file -s :osc.txt   # size of indexed version, with only worktree removals applied
wc -c osc.txt              # size of worktree version

然后你可以

git reset @ -- osc.txt

重置索引状态。

答案 2 :(得分:0)

git diff会显示已删除或已添加的内衬数量 使用awk,sed或任何其他unix命令从输入中提取数据

--shortstat就是你想要的:

git diff --shortstat commit1 commit2

git cat-file -s将输出git中对象的大小(以字节为单位) git diff-tree可以告诉你一棵树和另一棵树之间的差异。

将它们放在一个名为git-file-size-diff的脚本中。

我们可以尝试以下内容:

#!/bin/sh

args=$(git rev-parse --sq "$@")

# the diff-tree will output line like:
# :040000 040000 4...acd0 fd...94 M main.webapp

# parse the parameters form the diff-tree
eval "git diff-tree -r $args" | {
  total=0

  # read all the above params as described in thi sline:
  # :040000 040000 4...acd0 fd...94 M   main.webapp
  while read A B C D M P
  do
    case $M in
      # modified file
      M) bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;;

      # Added file
      A) bytes=$(git cat-file -s $D) ;;

      # deleted file
      D) bytes=-$(git cat-file -s $C) ;;
      *)

      # Error - no file status found
      echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\"
      continue
      ;;

    # close the case statment
    esac

    # sum the total bytes so far
    total=$(( $total + $bytes ))

    # print out the (bytes) & the name of the file ($P)
    printf '%d\t%s\n' $bytes "$P"
  done

  # print out the grand total
  echo total $total
}

在使用中,如下所示:

$ git file-size-diff HEAD~850..HEAD~845
-234   a.txt
112    folder/file.txt
-4     README.md
28     b.txt
total -98

通过使用git-rev-parse,它应该接受指定提交范围的所有常用方法。

注意
bash在子shell中运行while while,因此额外的花括号可以避免在子shell退出时丢失总数。