考虑这个脚本:
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
然而,它只显示添加和删除的行数,而不是字节。
答案 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 :(得分: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退出时丢失总数。