Znajdowanie większości zmienionych plików w Git

105

Jak mogę pokazać pliki w Git, które zmieniają się najczęściej?

Sebastian
źródło

Odpowiedzi:

45

możesz użyć polecenia git effort(z git-extraspakietu), które pokazuje statystyki dotyczące liczby zatwierdzeń na plik (według zatwierdzeń i aktywnych dni).

EDYCJA: wysiłek git to tylko skrypt bash, który możesz znaleźć tutaj i dostosować do swoich potrzeb, jeśli potrzebujesz czegoś bardziej specjalnego.

Asenar
źródło
Wynik zostanie podzielony na 2 części, najpierw otrzymasz wyniki nieposortowane, a następnie posortowane (i pokolorowane) wyniki. Dobrze?
Andy
@Andy wydaje się (i git help effortnie ma o tym żadnych informacji: /). Zakładam, że pierwszy zestaw wyników jest uporządkowany według nazwy pliku, a drugi według liczby zatwierdzeń na plik. Strona podręcznika zawiera również wzmiankę o github.com/tj/git-extras/issues, aby zgłosić problemy
Asenar,
czy to jest podobne do tego? blog.riff.org/…
155

Możesz zrobić coś takiego:

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

Dziennik wyświetla tylko nazwy plików, które zostały zmienione w każdym zatwierdzeniu, podczas gdy reszta po prostu sortuje i wyświetla 10 najczęściej pojawiających się nazw plików.

Mark Longair
źródło
Czy możesz mi powiedzieć, czy jest to oparte na bieżącej gałęzi, czy też w całym repozytorium? A co z oddziałami, które nie zostały jeszcze połączone?
Karthick S
@KarthickS: dotyczy to tylko zatwierdzeń w bieżącej gałęzi - możesz dodać --branchesdo, git logjeśli chcesz dołączyć zatwierdzenia do dowolnego z lokalnych oddziałów.
Mark Longair
1
Miły. Znalazłem również raporty o plikach, które zostały usunięte dawno temu. Szybkim rozwiązaniem było ograniczenie czasu, np .: --since = "zeszły rok"
FractalSpace
2
pomocne jest również użycie --since "1 month ago"lub innych opcji zawężania okna czasowego
3
Znaleziono część mojej odpowiedzi:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331
13

Zauważyłem, że zarówno Mark i sehe w odpowiedzi do not --followplików, to znaczy oni zatrzymać po osiągnięciu zmienić nazwy pliku. Ten skrypt będzie znacznie wolniejszy, ale będzie działał w tym celu.

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
źródło
1
Aby to rozwinąć, utworzyłem gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350 Agreguje zmiany według folderu, w szczególności każdego folderu w roleskatalogu dla mojego przypadku, ale można go łatwo zmodyfikować, aby pasował do twojego przypadku użycia.
Almenon
3

W przypadku programu PowerShell zakładając, że masz zainstalowany program git bash

git log --pretty=format: --name-only | sort | uniq -c | sort -Descending | select -First 10
hyeomans
źródło
3

To jest wersja systemu Windows

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

następnie otwórz w programie 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),"")

utwórz tabelę przestawną

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

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest
Mickey Perlstein
źródło
Ponieważ niewiele wiem o programie Excel, nie rozumiem tych instrukcji.
BigMiner
2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

Jeśli chcesz tylko zobaczyć swoje pliki, dodaj --authordo git whatchanged --author=name --all.

Andy
źródło
1

Stare pytanie, ale myślę, że nadal jest bardzo przydatne. Oto działający przykład w prostym programie PowerShell. Spowoduje to wyświetlenie 10 najczęściej zmienianych plików w repozytorium w odniesieniu do gałęzi, w której się znajdujesz.

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
źródło
0

Możemy też dowiedzieć się, jakie pliki zmieniły się między dwoma zatwierdzeniami lub gałęziami, np

git log  --pretty=format: --name-only <source_branch>...<target_branch> | sort | uniq -c | sort -rg | head -50 
Pawan Maheshwari
źródło
0

Jest to prawdopodobnie oczywiste, ale podane zapytania pokażą wszystkie pliki, ale być może nie chcesz wiedzieć, że pliki konfiguracji lub projektu są najbardziej aktualne. Prosty grep izoluje pliki z kodem, na przykład:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
Reginald Blue
źródło