Encontrando os arquivos mais alterados no Git


105

Como posso mostrar arquivos no Git que mudam com mais frequência?

Respostas:


45

você pode usar o comando git effort(do git-extraspacote) que mostra estatísticas sobre quantos commits por arquivos (por commits e dias ativos).

EDIT: git effort é apenas um script bash que você pode encontrar aqui e adaptar às suas necessidades se precisar de algo mais especial.


A saída será dividida em 2 partes, primeiro você obtém os resultados não classificados e, em seguida, os resultados classificados (e coloridos). Certo?
Andy

@Andy parece (e git help effortnão tem informações sobre isso: /). Presumo que o primeiro conjunto de resultados seja ordenado por nome de arquivo e o segundo por número de commit por arquivo. A página do manual também menciona github.com/tj/git-extras/issues para relatar problemas
Asenar

isso é parecido com isso? blog.riff.org/…

155

Você poderia fazer algo como o seguinte:

git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10

O log apenas exibe os nomes dos arquivos que foram alterados em cada confirmação, enquanto o resto apenas classifica e exibe os 10 nomes de arquivo que aparecem com mais frequência.


Você pode me dizer se isso é baseado no branch atual ou se é para todo o repositório? E as filiais ainda não fundidas?
Karthick S

@KarthickS: isso é apenas para commits no branch atual - você pode adicionar --branchesao git logse quiser incluir commits em qualquer um de seus branches locais.
Mark Longair

1
Agradável. Além disso, descobri que ele também relata arquivos que foram excluídos há muito tempo. A solução rápida foi limitar o tempo, por exemplo: --since = "ano passado"
FractalSpace

2
também é útil usar --since "1 month ago"ou outras opções para reduzir a janela de tempo

3
Encontrei parte da minha resposta:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331

13

Percebi que as respostas de Mark e Sehe não correspondem --followaos arquivos, ou seja, elas param quando chegam a uma renomeação de arquivo. Este script será muito mais lento, mas funcionará para esse propósito.

git ls-files |
while read aa
do
  printf . >&2
  set $(git log --follow --oneline "$aa" | wc)
  printf '%s\t%s\n' $1 "$aa"
done > bb
echo
sort -nr bb
rm bb

git-most.sh


1
Para expandir isso, criei gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350. Ele agrega alterações por pasta, especificamente por cada pasta no rolesdiretório do meu caso, mas é facilmente modificado para se adequar ao seu caso de uso.
Almenon

3

Para o PowerShell, supondo que você tenha o git bash instalado

git log --pretty=format: --name-only | sort | uniq -c | sort -Descending | select -First 10

3

Esta é uma versão do Windows

git log --pretty=format: --name-only  > allfiles.csv

então abra no excel

A1: FileName
A2: isVisibleFilename  >> =IFERROR(IF(C2>0,TRUE,FALSE),FALSE)
A3: DotLocation >> =FIND("@",SUBSTITUTE(A2,".","@",(LEN(A2)-LEN(SUBSTITUTE(A2,".","")))/LEN(".")))
A4: HasExt       >> =C2>1
A5: TYPE        >> =IF(D2=TRUE,MID(A2,C2+1,18),"")

criar tabela dinâmica

values: Type
  Filter: isFilename = true
  Rows : Type
  Sub : FileName

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest

Porque eu não sei muito sobre o Excel, não entendo essas instruções.
BigMiner

2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

Se você só deseja ver seus arquivos, adicione --authora git whatchanged --author=name --all.


1

Pergunta antiga, mas acho que ainda é uma pergunta muito útil. Aqui está um exemplo de trabalho em PowerShell direto. Isso obterá os 10 arquivos mais alterados em seu repositório com relação ao branch em que você está.

git log --pretty=format: --name-only | Where-Object { ![string]::IsNullOrEmpty($_) } | Sort-Object | Group-Object  | Sort-Object -Property Count -Descending | Select-Object -Property Count, Name -First 10

0

Nós também podemos descobrir arquivos alterados entre dois commits ou branches, por exemplo

git log  --pretty=format: --name-only <source_branch>...<target_branch> | sort | uniq -c | sort -rg | head -50 

0

Isso provavelmente é óbvio, mas as consultas fornecidas mostrarão todos os arquivos, mas, talvez você não esteja interessado em saber se seus arquivos de configuração ou projeto são os mais atualizados. Um simples grep irá isolar seus arquivos de código, por exemplo:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.