Finden der am meisten geänderten Dateien in Git

105

Wie kann ich Dateien in Git anzeigen, die sich am häufigsten ändern?

Sebastian
quelle

Antworten:

45

Sie können den Befehl git effort(aus dem git-extrasPaket) verwenden, der Statistiken darüber anzeigt, wie viele Commits pro Datei (nach Commits und aktiven Tagen) vorliegen.

BEARBEITEN: Git-Aufwand ist nur ein Bash-Skript, das Sie hier finden und an Ihre Bedürfnisse anpassen können, wenn Sie etwas Besonderes benötigen.

Asenar
quelle
Die Ausgabe ist zweiteilig. Zuerst erhalten Sie die unsortierten Ergebnisse, dann die sortierten (und farbigen) Ergebnisse. Richtig?
Andy
@ Andy scheint es (und git help efforthat keine Informationen darüber: /). Ich gehe davon aus, dass die ersten Ergebnisse nach Dateinamen und die zweiten nach Anzahl der Festschreibungen pro Datei sortiert sind. Die Manpage erwähnt auch github.com/tj/git-extras/issues , um Probleme zu melden
Asenar
ist das ähnlich? blog.riff.org/…
155

Sie könnten Folgendes tun:

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

Das Protokoll gibt nur die Namen der Dateien aus, die bei jedem Commit geändert wurden, während der Rest nur die 10 am häufigsten vorkommenden Dateinamen sortiert und ausgibt.

Mark Longair
quelle
Können Sie mir bitte sagen, ob dies auf dem aktuellen Zweig basiert oder ob es sich um das gesamte Repository handelt? Was ist mit noch nicht zusammengeschlossenen Filialen?
Karthick S
@KarthickS: Dies gilt nur für Commits in der aktuellen Filiale. Sie können diese hinzufügen --branches, git logwenn Sie Commits in eine Ihrer lokalen Filialen aufnehmen möchten.
Mark Longair
1
Nett. Außerdem habe ich festgestellt, dass es auch Berichtsdateien gibt, die vor langer Zeit gelöscht wurden. Schnelle Lösung war, die Zeit zu begrenzen, zB: --since = "letztes Jahr"
FractalSpace
2
Ebenfalls hilfreich ist die Verwendung --since "1 month ago"oder anderer Optionen, um das Zeitfenster
3
Gefundener Teil meiner Antwort:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331
13

Mir ist aufgefallen, dass sowohl die Antworten von Mark als auch von sehe nicht --followdie Dateien enthalten, dh, sie werden angehalten , sobald sie eine Umbenennung der Datei erreichen. Dieses Skript ist viel langsamer, funktioniert aber für diesen Zweck.

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
quelle
1
Um dies zu erweitern, habe ich gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350 erstellt . Es aggregiert Änderungen nach Ordner, insbesondere nach jedem Ordner im rolesVerzeichnis für meinen Fall, kann jedoch leicht an Ihren Anwendungsfall angepasst werden.
Almenon
3

Für Powershell, vorausgesetzt, Sie haben Git Bash installiert

git log --pretty=format: --name-only | sort | uniq -c | sort -Descending | select -First 10
Hyänen
quelle
3

Dies ist eine Windows-Version

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

dann in Excel öffnen

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),"")

Pivot-Tabelle erstellen

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

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest
Mickey Perlstein
quelle
Da ich nicht viel über Excel weiß, verstehe ich diese Anweisungen nicht.
BigMiner
2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

Wenn Sie nur Ihre Dateien sehen möchten , fügen Sie --authorzu git whatchanged --author=name --all.

Andy
quelle
1

Alte Frage, aber ich denke immer noch eine sehr nützliche Frage. Hier ist ein Arbeitsbeispiel in Straight Powershell. Dadurch erhalten Sie die 10 am häufigsten geänderten Dateien in Ihrem Repo in Bezug auf den Zweig, in dem Sie sich befinden.

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
quelle
0

Wir können auch herausfinden, welche Dateien zwischen zwei Commits oder Zweigen geändert wurden, z

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

Dies ist wahrscheinlich offensichtlich, aber die bereitgestellten Abfragen zeigen alle Dateien an. Vielleicht möchten Sie jedoch nicht wissen, dass Ihre Konfigurations- oder Projektdateien am aktuellsten sind. Ein einfacher Grep isoliert Ihre Codedateien, zum Beispiel:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
Reginald Blue
quelle