Um ano de estatísticas do git diff

Eu queria revisar as alterações que fiz em uma base de código no ano passado, então fiz o seguinte:

Primeiro, recebi todos os hashes dos meus commits do ano passado:

git log --author=mboehm --since=1/1/2013 --until=12/31/2013 --cherry --pretty=format:"%h"

Se desejar, você pode inserir um% s no formato para ler os status e confirmar se tudo está correto.

Observe que estou usando --cherrypara pular mesclagens.

Em seguida, executei um loop nos hashes e, para cada um, calculei o diff stat:

for HASH in $(git log --author=mboehm --since=1/1/2013 --until=12/31/2013 --cherry --pretty=format:"%h"); do   git diff --stat=250,999 $HASH "$HASH~1"; done

Os stat=250,999meios que eu quero o nome do arquivo a ser até 250 caracteres e a largura da linha a ser até 999. Este é um I empregam corte, porque sem ele, git irá tentar abreviar os nomes de arquivos na saída.

Esta saída contém linhas de resumo e alterações em arquivos binários. Vamos removê-los canalizando para:

sed -e '/ Bin /d' -e '/^ [0-9]+ file/d'

Também decidi normalizar o número de espaços antes do separador de tubos:

sed -e 's/ +|/    |/'

Em seguida, canalizei a saída sortpara que fosse agrupada por arquivo (alguns podem preferir deixá-la cronológica)

Vamos colocar tudo isso junto:

for HASH in $(git log --author=mboehm --since=1/1/2013 --until=12/31/2013 --cherry --pretty=format:"%h"); do   git diff --stat=250,999 $HASH "$HASH~1"; done | sed -e '/ Bin /d' -e '/^ [0-9]+ file/d' -e 's/ +|/    |/' | sort | less

Você pode querer passar por esta saída e excluir quaisquer bibliotecas de terceiros que você adicionou, pois elas podem ser muito barulhentas. Felizmente, como a saída é classificada, eles geralmente são agrupados.