Como posso "abusar" da culpa (ou de alguma função mais adequada e / ou em conjunto com os comandos do shell) para me fornecer uma estatística de quantas linhas (de código) estão atualmente no repositório originárias de cada committer?
Saída de exemplo:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
Respostas:
Atualizar
Eu atualizei algumas coisas no caminho.
Por conveniência, você também pode colocar isso em seu próprio comando:
armazene-o em algum lugar do seu caminho ou modifique-o e use-o como
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Resposta original
Enquanto a resposta aceita faz o trabalho, é muito lenta.
é quase instantâneo.
Para obter uma lista dos arquivos rastreados atualmente, você pode usar
Essa solução evita chamadas
file
para determinar o tipo de arquivo e usa grep para corresponder à extensão desejada por motivos de desempenho. Se todos os arquivos forem incluídos, remova-o da linha.se os arquivos puderem conter espaços, o que é ruim para os shells, você pode usar:
Dê uma lista de arquivos (através de um canal) que se pode usar xargs para chamar um comando e distribuir os argumentos. Os comandos que permitem o processamento de vários arquivos obedecem ao
-n1
. Nesse caso, chamamosgit blame --line-porcelain
e para cada chamada usamos exatamente 1 argumento.Em seguida, filtramos a saída para ocorrências de "autor", classificamos a lista e contamos linhas duplicadas por:
Nota
Outras respostas, na verdade, filtram linhas que contêm apenas espaços em branco.
O comando acima imprimirá autores de linhas que contenham pelo menos um caractere que não seja um espaço em branco. Você também pode usar a correspondência,
\w*[^\w#]
que também excluirá linhas nas quais o primeiro caractere que não seja um espaço em branco não seja#
(comentário em muitas linguagens de script).fonte
echo "a\nb\nc"|xargs -n1 cmd
será expandido paracmd a; cmd b; cmd d
git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
Eu escrevi uma jóia chamada git-fame que pode ser útil.
Instalação e uso:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
Resultado:
fonte
Explicação passo a passo:
Listar todos os arquivos sob controle de versão
Limpe a lista para baixo apenas para arquivos de texto
O Git culpa todos os arquivos de texto, ignorando as alterações de espaço em branco
Retire os nomes dos autores
Classifique a lista de autores e faça com que uniq conte o número de linhas repetidas consecutivamente
Exemplo de saída:
fonte
sed
versão diferente , a minha não entende a-r
bandeira e tem problemas com o regex (reclama de parênteses desequilibrados, mesmo quando removo o excedente(
).sudo brew install gnu-sed
pra lá , resolveu. Funciona como um encanto!port install gsed
para usuários do MacPorts.sudo brew install gnu-sed
(que funcionou), mas ainda recebo erros que o sed não reconhece -r. :(git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
git summary
fornecido pelo pacote git-extras é exatamente o que você precisa. Confira a documentação em git-extras - git-summary :Fornece uma saída parecida com esta:
fonte
A solução de Erik foi incrível, mas tive alguns problemas com sinais diacríticos (apesar de minhas
LC_*
variáveis de ambiente serem definidas ostensivamente corretamente) e ruído vazando nas linhas de código que realmente tinham datas nelas. Meu sed-fu é ruim, então acabei com esse trecho de frankenstein com rubi, mas funciona perfeitamente para mim em mais de 200.000 LOC e classifica os resultados:Observe também, em
gsed
vez desed
porque é a instalação do homebrew binário, deixando o sistema intacto.fonte
git shortlog -sn
Isso mostrará uma lista de confirmações por autor.
fonte
Aqui está o trecho principal da resposta do @Alex que realmente faz a operação de agregar as linhas de culpa. Eu o reduzi para operar em um único arquivo, e não em um conjunto de arquivos.
Publico aqui porque volto a esta resposta com frequência e relendo a publicação e digerindo novamente os exemplos para extrair a parte que eu valorizo que está tributando. Nem é genérico o suficiente para o meu caso de uso; seu escopo é para todo um projeto C.
Eu gosto de listar estatísticas por arquivo, obtidas com um
for
iterador bash em vez dexargs
achar xargs menos legível e difícil de usar / memorizar, A vantagem / desvantagens xargs vs for devem ser discutidas em outros lugares.Aqui está um trecho prático que mostrará resultados para cada arquivo individualmente:
E eu testei, executar este stright em um shell bash é ctrl + c seguro; se você precisar colocar isso dentro de um script bash, talvez seja necessário interceptar o SIGINT e o SIGTERM, se desejar que o usuário seja capaz de interromper seu loop for.
fonte
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nr
Encontrei um pequeno ajuste nogit blame
aqui que retrata com mais precisão as estatísticas que eu estava procurando. Especificamente, a opção -M e -C -C (esses são dois Cs de propósito). -M detecta movimentos dentro do arquivo e -C -C detecta linhas copiadas de outros arquivos. Veja o documento aqui . Para completar, -w ignora os espaços em branco.Confira o comando gitstats disponível em http://gitstats.sourceforge.net/
fonte
Eu tenho esta solução que conta as linhas culpadas em todos os arquivos de texto (excluindo os arquivos binários, mesmo os versionados):
fonte
Isso funciona em qualquer diretório da estrutura de origem do repositório, caso você queira inspecionar um determinado módulo de origem.
fonte
Adotei a principal resposta ao Powershell:
É opcional se você executa
git blame
com o-w
switch, eu o adicionei porque ignora as alterações de espaço em branco.O desempenho em minha máquina era a favor do Powershell (~ 50s vs ~ 65s para o mesmo repo), embora a solução Bash estivesse sendo executada no WSL2
fonte
Criei meu próprio script, que é uma combinação de @nilbus e @Alex
fonte
enter code here
estava causando problemas .... isso funciona corretamente?Função Bash que visa um único arquivo de origem executado no MacOS.
fonte