Encontrando os arquivos mais alterados no Git

105

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

Sebastian
fonte

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.

Asenar
fonte
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.

Mark Longair
fonte
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

Steven Penny
fonte
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
hyeomans
fonte
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
Mickey Perlstein
fonte
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.

Andy
fonte
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
Omar Rodriguez
fonte
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 
Pawan Maheshwari
fonte
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
Reginald Blue
fonte