Finden der am meisten geänderten Dateien in Git


105

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

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.


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.


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


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

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

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.


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

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 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.