我正在尝试从提交中获取每个文件的文件名和更改次数。
理想情况下,我会输出如下:
file1.txt +10 -20
file2.txt +239 -15
到目前为止,我有:
git show --pretty="format:" --name-only
但这只能获取文件名。
答案 0 :(得分:3)
您可以通过获取带有numstat
标志的格式,然后通过awk传递它们来反转它们来实现该结果。
git show COMMIT_ID --pretty="format:" --numstat | awk '{name=$3; insertions=$1; deletions=-$2; print name, insertions, deletions}'
答案 1 :(得分:1)
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退出时丢失总数。