如何在提交之间聚合代码更改

时间:2014-12-22 09:01:12

标签: git shell

我希望看到类似聚合的git log --shortstat --oneline

而不是以下,

2fd8b62 quote sending successfully
 5 files changed, 26 insertions(+), 40 deletions(-)
5bc977e Hackedup old (redundant) code so that project compiles
 14 files changed, 90 insertions(+), 80 deletions(-)

我想要像

这样的东西
 19 files changed, 116 insertions, 120 deletions.

据我所知,这将包含大量冗余数据(因为更改的文件可能很常见,等等)但我想跟踪一天(比方说)或任何时间段内完成的工作。

我无法弄清楚解析

生成的输出的简单方法
git log --shortstat --oneline commit1...commit2

要找到总变化,我可以

git diff --shortstat --oneline commit1...commit2

但我不想要这个。我正在考虑每个提交都是有效的更改,即使它在以后的提交中被部分撤消。

1 个答案:

答案 0 :(得分:0)

This gist提供了一个可能的解决方案:

git log --shortstat  | grep "files changed" | gawk '{files+=$1; inserted+=$4; deleted+=$6} END {print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'

在多行上,为了便于阅读:

git log --shortstat  | grep "files changed" | \
gawk '{files+=$1; inserted+=$4; deleted+=$6} END \ 
{print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'

我刚刚在git repo上尝试了过去10天的提交(甚至可以在Windows上运行):

c:\prgs\vonc\git\git>
git log --oneline --shortstat --since="10 days ago" | grep "files changed" | gawk '{files+=$1; inserted+=$4; deleted+=$6} END {print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'
files changed 47 lines inserted: 397 lines deleted: 30

同样的技术(using gawk)允许您聚合其他数据,例如每位作者的提交数量:

git log --pretty=format:%an | gawk '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'| gsort -r

git log --pretty=format:%an | \
gawk '{ ++c[$0]; } END \
{ for(cc in c) printf "%5d %s\n",c[cc],cc; }'| gsort

同样,在git repo上,在Windows上,它确实有效:

c:\prgs\vonc\git\git>
git log --pretty=format:%an --since="10 days ago" | gawk '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'| gsort
   23 Junio C Hamano
     8 Jeff King
     3 Johannes Schindelin

请注意,它有点矫枉过正,因为它包含了合并提交 更简单的是

c:\prgs\vonc\git\git>
git shortlog -sn --no-merges --since="10 days ago"
     8  Jeff King
     6  Junio C Hamano
     3  Johannes Schindelin