Existe um comando que eu possa chamar que contará as linhas alteradas por um autor específico em um repositório Git? Eu sei que deve haver maneiras de contar o número de confirmações, pois o Github faz isso para o gráfico de impacto.
458
git://git.lwn.net/gitdm.git
.Respostas:
A saída do comando a seguir deve ser razoavelmente fácil de enviar ao script para adicionar os totais:
Isso fornece estatísticas para todos os commits no HEAD atual. Se você quiser adicionar estatísticas em outras ramificações, precisará fornecê-las como argumentos
git log
.Para passar para um script, remover até o formato "on-line" pode ser feito com um formato de log vazio e, como comentado por Jakub Narębski,
--numstat
é outra alternativa. Ele gera estatísticas por arquivo em vez de estatísticas por linha, mas é ainda mais fácil de analisar.fonte
--numstat
vez de,--shortstat
se quiser adicionar estatísticas um pouco mais fácil.git help log
diz que as primeiras são linhas adicionadas e as segundas excluídas.Isso fornece algumas estatísticas sobre o autor, modifique conforme necessário.
Usando o Gawk:
Usando o Awk no Mac OSX:
EDIT (2017)
Existe um novo pacote no github que parece liso e usa o bash como dependências (testado no linux). É mais adequado para uso direto, em vez de scripts.
É git-quick-stats (link do github) .
cópia de
git-quick-stats
para uma pasta e adicione a pasta ao caminho.Uso:
fonte
gawk
paraawk
fazê-lo funcionar no terminal OSXgit clone https://github.com/arzzen/git-quick-stats.git
Caso alguém queira ver as estatísticas de todos os usuários em sua base de código, alguns de meus colegas de trabalho recentemente criaram essa horrível frase:
(Demora alguns minutos para analisar nosso repo, que tem cerca de 10 a 15 mil confirmações.)
fonte
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Git fame https://github.com/oleander/git-fame-rb
é uma boa ferramenta para obter a contagem de todos os autores de uma só vez, incluindo a contagem de arquivos modificados e confirmados:
Também há a versão do Python em https://github.com/casperdcl/git-fame (mencionada por @fracz):
Saída de amostra:
Mas esteja avisado: como mencionado por Jared no comentário, fazê-lo em um repositório muito grande levará horas. Não tenho certeza se isso pode ser melhorado, considerando que ele deve processar tantos dados do Git.
fonte
git fame --branch=dev --timeout=-1 --exclude=Pods/*
Eu achei o seguinte útil para ver quem tinha mais linhas que estavam atualmente na base de código:
As outras respostas se concentraram principalmente nas linhas alteradas nos commits, mas se os commits não sobreviverem e forem sobrescritos, eles podem ter sido apenas rotativos. O encantamento acima também fornece a todos os committers classificados por linhas, em vez de apenas um de cada vez. Você pode adicionar algumas opções para culpar git (-C -M) para obter números melhores que consideram a movimentação de arquivos e a linha entre arquivos, mas o comando pode demorar muito mais se você o fizer.
Além disso, se você estiver procurando linhas alteradas em todas as confirmações para todos os confirmadores, o pequeno script a seguir é útil:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
fonte
/^.*\((.*?)\s[\d]{4}/
deve ser/^.*?\((.*?)\s[\d]{4}/
para evitar parênteses correspondentes na fonte como autor.Para contar o número de confirmações de um determinado autor (ou todos os autores) em um determinado ramo, você pode usar o git-shortlog ; veja especialmente its
--numbered
e--summary
options, por exemplo, quando executado no repositório git:fonte
v1.6.4
está aqui neste exemplo para tornar a saída determinística: será o mesmo, não importa quando você clonou e / ou buscou no repositório git.v1.6.4
me dá:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
ou, se você preferir não incluir mesclagensgit shortlog -sne --no-merges
-s
é--summary
,-n
é--numbered
e [novo]-e
é--email
para mostrar emails de autores (e contar separadamente o mesmo autor com endereço de email diferente, levando em consideração as.mailmap
correções). Boa ligação--no-merges
.Depois de olhar para a resposta de Alex e Gerty3000 , tentei encurtar a frase :
Basicamente, usando o git log numstat e não mantendo o controle do número de arquivos alterados.
Git versão 2.1.0 no Mac OSX:
Exemplo:
fonte
A resposta do AaronM usando o one-liner do shell é boa, mas, na verdade, existe outro bug, em que os espaços corrompem os nomes de usuário se houver quantidades diferentes de espaços em branco entre o nome do usuário e a data. Os nomes de usuário corrompidos fornecerão várias linhas para a contagem de usuários e você deverá resumir você mesmo.
Essa pequena alteração corrigiu o problema para mim:
Observe os + após \ s que consumirão todos os espaços em branco do nome até a data.
Na verdade, adicionar esta resposta tanto para minha lembrança quanto para ajudar outras pessoas, já que esta é pelo menos a segunda vez que pesquiso no assunto :)
--show-email
paragit blame -w
agregar no email, pois algumas pessoas usamName
formatos diferentes em computadores diferentes e, às vezes, duas pessoas com o mesmo nome estão trabalhando no mesmo git.fonte
unsupported file type
mas, caso contrário, parece funcionar bem mesmo com eles (os ignora).Aqui está uma pequena lista que produz estatísticas para todos os autores. É muito mais rápido que a solução de Dan acima em https://stackoverflow.com/a/20414465/1102119 (a mina possui complexidade de tempo O (N) em vez de O (NM) onde N é o número de confirmações e M o número de autores )
fonte
--no-show-signature
, caso contrário, as pessoas que assinam pgp seus commits não serão contadas.count-lines = "!f() { git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = \"\"; next } END { for (a in ins) { printf \"%10d %10d %10d %s\\n\", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn; }; f"
. (Note que eu estou no Windows, você pode precisar usar diferentes tipos de citações)O @mmrobins @AaronM @ErikZ O @JamesMishra forneceu variantes que todos têm um problema em comum: pedem ao git que produza uma mistura de informações não destinadas ao consumo de scripts, incluindo conteúdo de linha do repositório na mesma linha e, em seguida, combine a bagunça com um regexp .
Esse é um problema quando algumas linhas não são válidas para texto UTF-8 e também quando algumas linhas coincidem com o regexp (isso aconteceu aqui).
Aqui está uma linha modificada que não apresenta esses problemas. Ele solicita ao git que produza dados de maneira limpa em linhas separadas, o que facilita a filtragem do que queremos de maneira robusta:
Você pode grep para outras strings, como autor-mail, committer, etc.
Talvez o primeiro faça
export LC_ALL=C
(supondobash
) forçar o processamento no nível de bytes (isso também acelera tremendamente o grep a partir das localidades baseadas em UTF-8).fonte
Uma solução foi fornecida com o ruby no meio, sendo o perl um pouco mais disponível por padrão aqui é uma alternativa usando o perl para linhas atuais por autor.
fonte
Além da resposta de Charles Bailey , você pode adicionar o
-C
parâmetro aos comandos. Caso contrário, as renomeações de arquivos contam como muitas adições e remoções (tantas quanto o arquivo tiver linhas), mesmo que o conteúdo do arquivo não tenha sido modificado.Para ilustrar, aqui está um commit com muitos arquivos sendo movidos de um dos meus projetos, ao usar o
git log --oneline --shortstat
comando:E aqui o mesmo commit usando o
git log --oneline --shortstat -C
comando que detecta cópias de arquivos e renomeia:Na minha opinião, o último fornece uma visão mais realista do impacto que uma pessoa teve no projeto, porque renomear um arquivo é uma operação muito menor do que gravá-lo do zero.
fonte
você pode usar o whodid ( https://www.npmjs.com/package/whodid )
e
ou apenas digite
então você pode ver resultados como este
fonte
-g
tive que vir antes do nome do pacotemacOS
. Simplesmente tentando ajudar.Aqui está um script ruby rápido que aumenta o impacto por usuário em relação a uma determinada consulta de log.
Por exemplo, para rubinius :
o script:
fonte
esta é a melhor maneira e também fornece uma imagem clara do número total de confirmações por todos os usuários
fonte
Forneci uma modificação de uma resposta curta acima, mas ela não foi suficiente para minhas necessidades. Eu precisava ser capaz de categorizar linhas confirmadas e linhas no código final. Eu também queria uma divisão por arquivo. Esse código não é recorrente, retornará apenas os resultados para um único diretório, mas é um bom começo se alguém quiser ir além. Copie e cole em um arquivo e torne o executável ou execute-o com Perl.
fonte
Para usuários do Windows, você pode usar o seguinte script em lote que conta linhas adicionadas / removidas para o autor especificado
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
fonte
Aqui está um ótimo repositório que facilita sua vida
git-quick-stats
Em um mac com o brew instalado
brew install git-quick-stats
Corre
git-quick-stats
Basta escolher a opção desejada nesta lista, digitando o número listado e pressionando Enter.
fonte
Este script aqui fará isso. Coloque-o em authorship.sh, chmod + x it, e está tudo pronto.
fonte
Salve seus logs no arquivo usando:
Para os amantes de Python:
Suas saídas seriam como:
fonte
Você quer culpa do Git .
Existe uma opção --show-stats para imprimir algumas estatísticas.
fonte
blame
, mas realmente não deu as estatísticas que eu pensei que o OP precisaria?A pergunta pedia informações sobre um autor específico , mas muitas das respostas eram soluções que retornavam listas classificadas de autores com base em suas linhas de código alteradas.
Era isso que eu estava procurando, mas as soluções existentes não eram perfeitas. No interesse das pessoas que podem encontrar essa pergunta pelo Google, eu fiz algumas melhorias e as transformei em um shell script, que mostro abaixo. Uma anotada (que continuarei mantendo) pode ser encontrada no meu Github .
Não há dependências no Perl ou no Ruby. Além disso, espaços em branco, renomeações e movimentos de linha são levados em consideração na contagem de alterações de linha. Basta colocar isso em um arquivo e passar seu repositório Git como o primeiro parâmetro.
fonte
A melhor ferramenta até agora identificada é o gitinspector. Ele fornece o relatório definido por usuário, por semana, etc. Você pode instalar como abaixo com o npm
npm install -g gitinspector
Os links para obter mais detalhes
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
comandos de exemplo são
fonte
Eu escrevi esse script Perl para realizar essa tarefa.
Eu o nomeei
git-line-changes-by-author
e coloquei/usr/local/bin
. Como ele está salvo no meu caminho, posso emitir o comandogit line-changes-by-author --before 2018-12-31 --after 2020-01-01
para obter o relatório para o ano de 2019. Como um exemplo. E se eu escrever incorretamente, o nome git sugerirá a grafia correta.Convém ajustar o
_get_repo_slug
sub para incluir apenas a última parte doremote.origin.url
arquivo, pois meus repositórios são salvosproject/repo
e o seu pode não ser.fonte