Jak mogę „obwinić” winę (lub jakąś lepiej dopasowaną funkcję i / lub w połączeniu z poleceniami powłoki), aby podać mi statystyczną liczbę wierszy (kodu) aktualnie znajdujących się w repozytorium pochodzących z każdego podmiotu odpowiedzialnego?
Przykładowe dane wyjściowe:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
Odpowiedzi:
Aktualizacja
Po drodze zaktualizowałem kilka rzeczy.
Dla wygody możesz również umieścić to w swoim własnym poleceniu:
przechowuj to gdzieś na swojej ścieżce lub zmodyfikuj swoją ścieżkę i używaj jej jak
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Oryginalna odpowiedź
Chociaż zaakceptowana odpowiedź spełnia swoje zadanie, jest bardzo powolna.
jest prawie natychmiastowy.
Aby uzyskać listę aktualnie śledzonych plików, możesz użyć
To rozwiązanie pozwala uniknąć wywoływania w
file
celu ustalenia rodzaju pliku i wykorzystuje grep do dopasowania pożądanego rozszerzenia ze względu na wydajność. Jeśli wszystkie pliki powinny zostać uwzględnione, po prostu usuń to z wiersza.jeśli pliki mogą zawierać spacje, które są szkodliwe dla powłok, możesz użyć:
Podaj listę plików (przez potok), za pomocą xargs można wywołać polecenie i rozdzielić argumenty. Polecenia, które umożliwiają przetwarzanie wielu plików, pozwalają ominąć
-n1
. W tym przypadku dzwonimygit blame --line-porcelain
i do każdego połączenia używamy dokładnie 1 argumentu.Następnie filtrujemy dane wyjściowe pod kątem wystąpienia „autora”, sortujemy listę i liczymy zduplikowane linie według:
Uwaga
Inne odpowiedzi faktycznie odfiltrowują wiersze zawierające tylko białe znaki.
Powyższe polecenie spowoduje wydrukowanie autorów wierszy zawierających co najmniej jeden znak spacji. Możesz także użyć dopasowania,
\w*[^\w#]
które wyklucza również wiersze, w których pierwszy znak inny niż biały nie jest#
(komentarz w wielu językach skryptowych).źródło
echo "a\nb\nc"|xargs -n1 cmd
rozwinie się docmd a; cmd b; cmd d
git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
Napisałem klejnot zwany git-fame, który może się przydać.
Instalacja i użytkowanie:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
Wynik:
źródło
Wyjaśnienie krok po kroku:
Wyświetl wszystkie pliki pod kontrolą wersji
Przycinaj listę tylko do plików tekstowych
Git obwinia wszystkie pliki tekstowe, ignorując zmiany białych znaków
Wyciągnij nazwiska autorów
Posortuj listę autorów i niech uniq policzy liczbę kolejno powtarzających się wierszy
Przykładowe dane wyjściowe:
źródło
sed
wersję, moja nie rozumie-r
flagi i ma problemy z regexem (narzeka na niezrównoważone pareny, nawet gdy usuwam nadwyżkę(
).sudo brew install gnu-sed
rozwiązałem to. Działa jak marzenie!port install gsed
dla użytkowników MacPorts.sudo brew install gnu-sed
(co zadziałało), ale wciąż dostaję błędy, których sed nie rozpoznaje -r. :(git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
git summary
dostarczone przez git-extras pakietu jest dokładnie to, czego potrzebują. Zapoznaj się z dokumentacją git-dodatków - git-podsumowanie :Daje wynik, który wygląda następująco:
źródło
Rozwiązanie Erika było niesamowite, ale miałem pewne problemy ze znakami diakrytycznymi (pomimo że moje
LC_*
zmienne środowiskowe są pozornie ustawione poprawnie) i szum przeciekał przez linie kodu, które faktycznie miały w nich daty. Moje sed-fu jest kiepskie, więc skończyłem z tym fragmentem Frankensteina z rubinem, ale działa dla mnie bezbłędnie na 200 000+ LOC i sortuje wyniki:Zauważ też, że
gsed
zamiastsed
tego instaluje się binarny homebrew, pozostawiając system bez zmian.źródło
git shortlog -sn
Spowoduje to wyświetlenie listy zatwierdzeń według autora.
źródło
Oto główny fragment odpowiedzi @Alex, który faktycznie wykonuje operację agregowania linii winy. Obciąłem go, aby działał na jednym pliku, a nie na zestawie plików.
Publikuję to tutaj, ponieważ często wracam do tej odpowiedzi i ponownie czytam post i ponownie analizuję przykłady, aby wyodrębnić część, którą cenię. Nie jest też wystarczająco ogólny dla mojego przypadku użycia; jego zakres dotyczy całego projektu C.
Lubię wyświetlać statystyki dla każdego pliku, uzyskiwane za pomocą
for
iteratora bash zamiast,xargs
ponieważ uważam, że xargs jest mniej czytelny i trudny w użyciu / zapamiętywaniu, zalety / wady xargs vs dla powinny być omówione gdzie indziej.Oto praktyczny fragment, który wyświetli wyniki dla każdego pliku osobno:
I przetestowałem, uruchamianie tego polecenia w powłoce bash jest bezpieczne ctrl + c, jeśli chcesz umieścić to w skrypcie bash, być może będziesz potrzebować Trap na SIGINT i SIGTERM, jeśli chcesz, aby użytkownik mógł przerwać twoją pętlę for.
źródło
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nr
Znaleziono drobną korektęgit blame
tutaj, która dokładniej przedstawia statystyki, których szukałem. W szczególności opcja -M i -C-C (celowo są to dwa litery C). -M wykrywa ruchy w pliku, a -C -C wykrywa skopiowane linie z innych plików. Zobacz dokument tutaj . Dla kompletności, -w ignoruje spacje.Sprawdź komendę gitstats dostępną na stronie http://gitstats.sourceforge.net/
źródło
Mam to rozwiązanie, które zlicza obwiniane linie we wszystkich plikach tekstowych (z wyjątkiem plików binarnych, nawet wersjonowanych):
źródło
Działa to w dowolnym katalogu struktury źródłowej repozytorium, na wypadek, gdybyś chciał sprawdzić określony moduł źródłowy.
źródło
I przyjął górną odpowiedź do PowerShell:
Jest to opcja, czy uruchomić
git blame
z-w
przełącznikiem, dodałem go, ponieważ ignoruje whitespace zmian.Wydajność na moim komputerze była korzystna dla Powershell (~ 50s w porównaniu do ~ 65s dla tego samego repo), chociaż rozwiązanie Bash działało pod WSL2
źródło
Stworzyłem własny skrypt, który jest kombinacją @nilbus i @Alex
źródło
enter code here
powodowała problemy ... czy to działa poprawnie?Funkcja Bash, której celem jest uruchomienie jednego pliku źródłowego w systemie MacOS.
źródło