Trovare la maggior parte dei file modificati in Git


105

Come posso mostrare i file in Git che cambiano più spesso?

Risposte:


45

puoi usare il comando git effort(dal git-extraspacchetto) che mostra le statistiche su quanti commit per file (per commit e giorni attivi).

EDIT: git effort è solo uno script bash che puoi trovare qui e adattare alle tue esigenze se hai bisogno di qualcosa di più speciale.


L'output sarà diviso in 2 parti, prima si ottengono i risultati non ordinati, quindi i risultati ordinati (e colorati). Destra?
Andy

@ Andy sembra (e git help effortnon ha informazioni al riguardo: /). Presumo che il primo set di risultati sia ordinato per nome file e il secondo per numero di commit per file. La pagina man menziona anche github.com/tj/git-extras/issues per segnalare problemi
Asenar

è simile a questo? blog.riff.org/…

155

Potresti fare qualcosa come il seguente:

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

Il registro restituisce solo i nomi dei file che sono stati modificati in ogni commit, mentre il resto ordina e restituisce solo i primi 10 nomi di file che appaiono più di frequente.


Puoi dirmi se è basato sul ramo corrente o se è per l'intero repository? E i rami non ancora uniti?
Karthick S

@KarthickS: questo è solo per i commit nel ramo corrente - puoi aggiungerlo --branchesa git logse vuoi includere i commit in uno dei tuoi rami locali.
Mark Longair

1
Bello. Inoltre, ho scoperto che riporta anche file cancellati molto tempo fa. La soluzione rapida era limitare il tempo, ad esempio: --since = "last year"
FractalSpace

2
è anche utile utilizzare --since "1 month ago"o altre opzioni per restringere la finestra temporale

3
Ho trovato parte della mia risposta:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331

13

Ho notato che sia di Mark e di sehe risposte non --followi file, vale a dire che si fermano una volta che raggiungono un file ridenominazione. Questo script sarà molto più lento, ma funzionerà a tale scopo.

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
Per espandere questo aspetto ho creato gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350 Aggrega le modifiche per cartella, in particolare per ciascuna cartella nella rolesdirectory per il mio caso, ma è facilmente modificabile per adattarsi al tuo caso d'uso.
Almenon

3

Per PowerShell, supponendo che tu abbia installato git bash

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

3

Questa è una versione per Windows

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

quindi apri in 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),"")

creare una tabella pivot

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

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

Poiché non so molto su Excel, non capisco queste istruzioni.
BigMiner

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

Se vuoi solo vedere i tuoi file aggiungere --authora git whatchanged --author=name --all.


1

Vecchia domanda, ma penso ancora una domanda molto utile. Ecco un esempio funzionante in PowerShell diretto. Questo otterrà i primi 10 file più modificati nel tuo repository rispetto al ramo in cui ti trovi.

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

Possiamo anche scoprire i file modificati tra due commit o branch, ad es

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

0

Questo è probabilmente ovvio, ma le query fornite mostreranno tutti i file, ma forse non ti interessa sapere che i tuoi file di configurazione o di progetto sono i più aggiornati. Un semplice grep isolerà i tuoi file di codice, ad esempio:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.