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 --cherry
para 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,999
meios 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 sort
para 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.