Czy istnieje polecenie, które mogę wywołać, które zlicza wiersze zmienione przez określonego autora w repozytorium Git? Wiem, że muszą istnieć sposoby na policzenie liczby zatwierdzeń, ponieważ Github robi to dla swojego wykresu wpływu.
458
git://git.lwn.net/gitdm.git
.Odpowiedzi:
Dane wyjściowe następującego polecenia powinny być dość łatwe do wysłania do skryptu, aby dodać sumy:
Daje to statystyki dla wszystkich zatwierdzeń na bieżącym HEAD. Jeśli chcesz dodać statystyki do innych gałęzi, musisz podać je jako argumenty
git log
.W przypadku przekazywania do skryptu usunięcie nawet formatu „oneline” można wykonać przy użyciu pustego formatu dziennika, a jak komentuje Jakub Narębski,
--numstat
jest inną alternatywą. Generuje statystyki dla poszczególnych plików zamiast dla poszczególnych linii, ale jest jeszcze łatwiejsze do analizy.źródło
--numstat
zamiast,--shortstat
jeśli chcesz dodać statystyki nieco łatwiej.git help log
mówi mi, że pierwsze są dodawane, drugie usuwane.Daje to statystyki dotyczące autora, modyfikuj zgodnie z wymaganiami.
Za pomocą Gawk:
Korzystanie z Awk w Mac OSX:
EDYCJA (2017)
Na githubie jest nowy pakiet, który wygląda gładko i używa bash jako zależności (testowane na Linuksie). Bardziej nadaje się do bezpośredniego użycia niż do skryptów.
To git-quick-statystyki (link github) .
Skopiuj
git-quick-stats
do folderu i dodaj folder do ścieżki.Stosowanie:
źródło
gawk
sięawk
, aby pracować w terminalu OSXgit clone https://github.com/arzzen/git-quick-stats.git
Na wypadek, gdyby ktokolwiek chciał zobaczyć statystyki dla każdego użytkownika w swojej bazie kodu, kilku moich współpracowników niedawno wymyśliło ten przerażający jeden linijka:
(Zajmuje kilka minut, aby przejrzeć nasze repozytorium, które zawiera około 10-15k zatwierdzeń.)
źródło
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Sława Git https://github.com/oleander/git-fame-rb
to miłe narzędzie do zliczania wszystkich autorów jednocześnie, w tym zatwierdzania i modyfikowania plików:
Istnieje również wersja Python na https://github.com/casperdcl/git-fame (wspomniana przez @fracz):
Przykładowe dane wyjściowe:
Ale ostrzegam: jak wspomniał Jared w komentarzu, zrobienie tego w bardzo dużym repozytorium zajmie kilka godzin. Nie jestem jednak pewien, czy można to poprawić, biorąc pod uwagę, że musi przetwarzać tyle danych Git.
źródło
git fame --branch=dev --timeout=-1 --exclude=Pods/*
Przydatne okazało się, kto ma najwięcej wierszy, które obecnie znajdowały się w bazie kodu:
Pozostałe odpowiedzi koncentrowały się głównie na wierszach zmienionych w zatwierdzeniach, ale jeśli zatwierdzenia nie przetrwają i zostaną nadpisane, mogły po prostu zostać odrzucone. Powyższe zaklęcie powoduje również, że wszystkie osoby zatwierdzające posortowane są według linii, a nie tylko pojedynczo. Możesz dodać kilka opcji do git blame (-C -M), aby uzyskać lepsze liczby uwzględniające ruch pliku i ruch linii między plikami, ale jeśli to zrobisz, polecenie może działać o wiele dłużej.
Ponadto, jeśli szukasz linii zmienionych we wszystkich zatwierdzeniach dla wszystkich osób zatwierdzających, pomocny jest następujący mały skrypt:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
źródło
/^.*\((.*?)\s[\d]{4}/
powinno być/^.*?\((.*?)\s[\d]{4}/
zapobieganie dopasowywaniu nawiasów w źródle jako autor.Aby policzyć liczbę zatwierdzeń danego autora (lub wszystkich autorów) w danym oddziale, możesz użyć git-shortlog ; zobacz w szczególności jego
--numbered
i--summary
opcje, np. podczas uruchamiania na repozytorium git:źródło
v1.6.4
jest tutaj w tym przykładzie, aby uczynić wynik deterministycznym: będzie taki sam bez względu na to, kiedy sklonowałeś i / lub pobierałeś z repozytorium git.v1.6.4
daje mi:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
lub, jeśli wolisz nie uwzględniać fuzjigit shortlog -sne --no-merges
-s
is--summary
,-n
is--numbered
i [new]-e
ma--email
wyświetlać e-maile autorów (i liczyć osobno tego samego autora z innym adresem e-mail, z uwzględnieniem.mailmap
poprawek). Dobry telefon--no-merges
.Po przeanalizowaniu odpowiedzi Alexa i Gerty3000 starałem się skrócić linijkę:
Zasadniczo, używając git log numstat i nie śledząc liczby zmienionych plików .
Wersja Git 2.1.0 na Mac OSX:
Przykład:
źródło
Odpowiedź z AaronM pomocą powłoki jedno-liner jest dobry, ale w rzeczywistości, istnieje jeszcze inny błąd, gdzie obowiązuje będzie uszkodzony nazwy użytkowników, jeśli istnieją różne ilości spacji między nazwą użytkownika i datą. Zepsute nazwy użytkowników dadzą wiele wierszy dla liczby użytkowników i musisz je sam podsumować.
Ta niewielka zmiana naprawiła dla mnie problem:
Zwróć uwagę na znaki + po, które zajmą wszystkie białe znaki od nazwy do daty.
Właściwie dodałem tę odpowiedź zarówno dla mojej własnej pamięci, jak i dla pomagania komukolwiek innemu, ponieważ to jest co najmniej drugi raz, gdy szukam w Google tematu :)
--show-email
abygit blame -w
zamiast tego agregować pocztą e-mail, ponieważ niektóre osoby używają różnychName
formatów na różnych komputerach, a czasami dwie osoby o tej samej nazwie pracują w tym samym git.źródło
unsupported file type
ale wydaje się, że nawet OK działa z nimi (pomija je).Oto krótki linijka, która generuje statystyki dla wszystkich autorów. Jest znacznie szybszy niż powyższe rozwiązanie Dana pod adresem https://stackoverflow.com/a/20414465/1102119 (moje ma złożoność czasową O (N) zamiast O (NM), gdzie N jest liczbą zatwierdzeń, a M liczbą autorów ).
źródło
--no-show-signature
, w przeciwnym razie ludzie, którzy podpiszą swoje pgp, nie zostaną policzeni.count-lines = "!f() { git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = \"\"; next } END { for (a in ins) { printf \"%10d %10d %10d %s\\n\", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn; }; f"
. (Uwaga: korzystam z systemu Windows; może być konieczne użycie różnego rodzaju cudzysłowów)@mmrobins @AaronM @ErikZ @JamesMishra dostarczył warianty, które mają wspólny problem: proszą git o stworzenie mieszanki informacji nieprzeznaczonych do użycia skryptu, w tym zawartości linii z repozytorium w tym samym wierszu, a następnie dopasowują bałagan do wyrażenia regularnego .
Jest to problem, gdy niektóre wiersze nie są poprawnym tekstem UTF-8, a także gdy niektóre wiersze pasują do wyrażenia regularnego (zdarzyło się to tutaj).
Oto zmodyfikowana linia, która nie ma tych problemów. Prosi gita o czyste dane wyjściowe w osobnych liniach, co ułatwia solidne filtrowanie tego, co chcemy:
Możesz grep dla innych ciągów znaków, takich jak autor-mail, komisarz itp.
Być może najpierw wykonaj
export LC_ALL=C
(zakładającbash
), aby wymusić przetwarzanie na poziomie bajtów (dzieje się tak również, aby znacznie przyspieszyć grep z ustawień regionalnych opartych na UTF-8).źródło
Podano rozwiązanie z rubinem pośrodku, ponieważ perl jest nieco bardziej dostępny domyślnie tutaj jest alternatywą użycie perla do bieżących linii autora.
źródło
Oprócz odpowiedzi Charlesa Baileya możesz chcieć dodać
-C
parametr do poleceń. W przeciwnym razie nazwy plików są liczone jako wiele dodatków i usunięć (tyle, ile plik ma wiersze), nawet jeśli zawartość pliku nie została zmodyfikowana.Aby to zilustrować, oto zatwierdzenie z dużą ilością plików przenoszonych z jednego z moich projektów, gdy używasz
git log --oneline --shortstat
polecenia:A tutaj to samo zatwierdzenie za pomocą
git log --oneline --shortstat -C
polecenia, które wykrywa kopie plików i zmienia nazwy:Moim zdaniem ta ostatnia daje bardziej realistyczny obraz wpływu, jaki dana osoba wywarła na projekt, ponieważ zmiana nazwy pliku jest znacznie mniejszą operacją niż zapisanie pliku od zera.
źródło
możesz użyć Whodid ( https://www.npmjs.com/package/whodid )
i
lub po prostu wpisz
wtedy możesz zobaczyć taki wynik
źródło
-g
mieliśmy przyjść przed nazwą pakietu, namacOS
. Po prostu próbuję pomóc.Oto szybki skrypt rubinowy, który koryguje wpływ na użytkownika względem danego zapytania dziennika.
Na przykład dla rubiniusa :
scenariusz:
źródło
jest to najlepszy sposób, a także daje wyraźny obraz całkowitej liczby zatwierdzeń przez wszystkich użytkowników
źródło
Podałem modyfikację krótkiej odpowiedzi powyżej, ale nie była ona wystarczająca dla moich potrzeb. Musiałem być w stanie kategoryzować zarówno zatwierdzone wiersze, jak i wiersze w końcowym kodzie. Chciałem też rozbić na pliki. Ten kod nie powtarza się, zwraca wyniki tylko dla jednego katalogu, ale jest to dobry początek, jeśli ktoś chce pójść dalej. Skopiuj i wklej do pliku, aby był wykonywalny lub uruchom go w Perlu.
źródło
W przypadku użytkowników systemu Windows można użyć następującego skryptu wsadowego, który zlicza dodane / usunięte wiersze dla określonego autora
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
źródło
Oto świetne repozytorium, które ułatwia Ci życie
git-quick-stats
Na komputerze Mac z zainstalowanym zaparzeniem
brew install git-quick-stats
Biegać
git-quick-stats
Wystarczy wybrać opcję z tej listy, wpisując numer na liście i naciskając Enter.
źródło
Ten skrypt tutaj to zrobi. Umieść go w authorship.sh, chmod + x it i gotowe.
źródło
Zapisz dzienniki w pliku, używając:
Dla miłośników Pythona:
Twoje wyniki wyglądałyby tak:
źródło
Chcesz winić Git .
Istnieje opcja --show-stats, aby wydrukować niektóre, no cóż, statystyki.
źródło
blame
, ale tak naprawdę to nie dawało statystyk, których myślałem, że OP będzie potrzebował?Pytanie dotyczyło informacji o konkretnym autorze, ale wiele odpowiedzi dotyczyło rozwiązań, które zwracały rankingowe listy autorów na podstawie zmienionych linii kodu.
Tego właśnie szukałem, ale istniejące rozwiązania nie były do końca idealne. W interesie osób, które mogą znaleźć to pytanie za pośrednictwem Google, ulepszyłem je i przekształciłem w skrypt powłoki, który wyświetlam poniżej. Adnotacje (które będę nadal utrzymywać) można znaleźć na moim Githubie .
Nie ma zależności ani od Perla, ani od Ruby. Ponadto, białe znaki, nazwy i ruchy linii są uwzględniane w liczbie zmian linii. Po prostu umieść to w pliku i przekaż swoje repozytorium Git jako pierwszy parametr.
źródło
Najlepszym dotychczas zidentyfikowanym narzędziem jest gitinspector. Daje zestaw raportów na użytkownika, na tydzień itp. Możesz zainstalować jak poniżej z npm
npm install -g gitinspector
Linki, aby uzyskać więcej informacji
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
przykładowe polecenia to
źródło
Napisałem ten skrypt Perla, aby wykonać to zadanie.
Nadałem mu nazwę
git-line-changes-by-author
i włożyłem/usr/local/bin
. Ponieważ jest zapisany na mojej ścieżce, mogę wydać polecenie,git line-changes-by-author --before 2018-12-31 --after 2020-01-01
aby uzyskać raport za rok 2019. Jako przykład. A jeśli miałbym źle napisać, nazwa git sugeruje poprawną pisownię.Możesz dostosować
_get_repo_slug
sub, aby zawierał tylko ostatnią część,remote.origin.url
ponieważ moje repozytoria są zapisywane jako,project/repo
a twoje mogą nie być.źródło