Git Blame Commit 통계
각 커미터에서 발생하는 저장소에 현재 얼마나 많은 줄(코드의)이 있는지 통계를 제공하기 위해 어떻게 책임(또는 더 적합한 함수 및/또는 셸 명령과 함께)을 "남용"할 수 있습니까?
출력 예:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
갱신하다
git ls-tree -r -z --name-only HEAD -- */*.c | sed 's/^/.\//' | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep -ae "^author "|sort|uniq -c|sort -nr
도중에 몇 가지 사항을 업데이트했습니다.
편의를 위해 이 명령을 자체 명령으로 실행할 수도 있습니다.
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | sed 's/^/.\//' | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep -ae "^author "|sort|uniq -c|sort -nr
경로 어딘가에 저장하거나 경로를 수정하여 다음과 같이 사용합니다.
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
원답
승인된 답변이 작업을 수행하는 동안 매우 느립니다.
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
거의 순간적입니다.
현재 추적 중인 파일 목록을 가져오려면 다음을 사용할 수 있습니다.
git ls-tree --name-only -r HEAD
이 솔루션은 호출을 방지합니다.file
파일 형식을 결정하고 성능상의 이유로 원하는 확장자와 일치하도록 grep을 사용합니다.모든 파일을 포함해야 하는 경우 줄에서 이 파일을 제거하면 됩니다.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
파일에 셸에 좋지 않은 공간이 포함될 수 있는 경우 다음을 사용할 수 있습니다.
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
파이프를 통해 xargs를 사용하여 명령을 호출하고 인수를 배포할 수 있는 파일 목록을 제공합니다.할 수 하는 명령어는 " " " " 을 합니다.-n1
이 경우에는 다음과 같이 부릅니다.git blame --line-porcelain
통화할 때마다 정확히 1개의 인수를 사용합니다.
xargs -n1 git blame --line-porcelain
그런 다음 출력을 필터링하여 "작성자"가 목록을 정렬하고 중복된 행을 카운트합니다.
grep "^author "|sort|uniq -c|sort -nr
메모
다른 답변은 공백만 포함된 줄을 실제로 필터링합니다.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
위의 명령은 공백이 아닌 문자를 하나 이상 포함하는 선의 작성자를 인쇄합니다.match 일를사수있습다니도할용을 할 수도 .\w*[^\w#]
또한 첫 번째 공백이 아닌 문자가 아닌 행은 제외됩니다.#
(여러 스크립트 언어로 제공됨).
저는 git-fame이라는 유용한 보석을 썼습니다.
설치 및 사용:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
출력:
Statistics based on master
Active files: 21
Active lines: 967
Total commits: 109
Note: Files matching MIME type image, binary has been ignored
+----------------+-----+---------+-------+---------------------+
| name | loc | commits | files | distribution (%) |
+----------------+-----+---------+-------+---------------------+
| Linus Oleander | 914 | 106 | 21 | 94.5 / 97.2 / 100.0 |
| f1yegor | 47 | 2 | 7 | 4.9 / 1.8 / 33.3 |
| David Selassie | 6 | 1 | 2 | 0.6 / 0.9 / 9.5 |
+----------------+-----+---------+-------+---------------------+
git ls-tree -r HEAD|sed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|sed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|sed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
단계별 설명:
버전 제어 하에 있는 모든 파일 나열
git ls-tree -r HEAD|sed -re 's/^.{53}//'
목록을 텍스트 파일로만 잘라냅니다.
|while read filename; do file "$filename"; done|grep -E ': .*text'|sed -r -e 's/: .*//'
모든 텍스트 파일을 탓하고 공백 변경은 무시합니다.
|while read filename; do git blame -w "$filename"; done
작성자 이름 삭제
|sed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'
작성자 목록을 정렬하고 연속적으로 반복되는 줄 수를 고유하게 세도록 합니다.
|sort|uniq -c
출력 예:
1334 Maneater
1924 Another guy
37195 Brian Ruby
1482 Anna Lambda
git summary
당신이 필요로 하는 것이 바로 git-sublish 패키지에 의해 제공되는 것입니다.git-extra - git-summary에서 설명서를 확인하십시오.
git summary --line
다음과 같은 출력을 제공합니다.
project : TestProject
lines : 13397
authors :
8927 John Doe 66.6%
4447 Jane Smith 33.2%
23 Not Committed Yet 0.2%
, 저는 부호에 .LC_*
표면적으로 정확하게 설정되는 환경 변수) 및 실제로 날짜가 포함된 코드 라인을 통해 노이즈가 누출됩니다.제 sed-fu는 형편없어서 결국 루비가 들어간 프랑켄슈타인 조각을 만들었습니다. 하지만 200,000개 이상의 LOC에서 완벽하게 작동하고 결과를 정렬합니다.
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 "$filename"; done | \
ruby -ne 'puts $1.strip if $_ =~ /^\w{8} \((.*?)\s*\d{4}-\d{2}-\d{2}/' | \
sort | uniq -c | sort -rg
참고 사항gsed
대신에sed
바이너리 홈브루 설치이기 때문에 시스템은 그대로 유지됩니다.
작성자별 커밋 목록이 표시됩니다.
다음은 @Alex의 답변의 주요 부분으로, 책임선을 집계하는 작업을 실제로 수행합니다.파일 집합이 아닌 하나의 파일에서 작동하도록 파일을 줄였습니다.
git blame --line-porcelain path/to/file.txt | grep "^author " | sort | uniq -c | sort -nr
저는 이 답변에 자주 돌아와서 게시물을 다시 읽고 예시를 다시 소화하여 제가 과세하는 부분을 추출하기 때문에 이 글을 올립니다.제 사용 사례에 충분히 일반적이지도 않습니다. 범위는 전체 C 프로젝트를 대상으로 합니다.
파일당 통계를 나열하고 bash를 사용하여 아카이브합니다.for
대신 반복기xargs
xargs를 읽을 수 없고 사용/기억하기 어렵기 때문에 xargs에 대한 장점/단점은 다른 곳에서 논의해야 합니다.
다음은 각 파일의 결과를 개별적으로 보여주는 실용적인 코드 조각입니다.
for file in $(git ls-files); do \
echo $file; \
git blame --line-porcelain $file \
| grep "^author " | sort | uniq -c | sort -nr; \
echo; \
done
그리고 bash 셸에서 이를 바로 실행하는 것이 ctrl+c 안전하다는 것을 테스트했습니다. bash 스크립트 안에 넣어야 할 경우 SIGINT 및 SIGTERM에 트랩을 해야 할 수도 있습니다. 사용자가 for 루프를 중단할 수 있도록 하려면.
http://gitstats.sourceforge.net/ 에서 gitstats 명령을 확인하십시오.
저는 파워셸에 대한 최고의 답변을 채택했습니다.
(git ls-tree -rz --name-only HEAD).Split(0x00) | where {$_ -Match '.*\.py'} |%{git blame -w --line-porcelain HEAD $_} | Select-String -Pattern '^author ' | Group-Object | Select-Object -Property Count, Name | Sort-Object -Property Count -Descending
실행 여부는 선택 사항입니다.git blame
와 함께-w
스위치, 공백 변경을 무시하기 때문에 추가했습니다.
Bash 솔루션이 WSL2에서 실행되고 있음에도 불구하고 시스템의 성능은 Powershell(동일한 리포의 경우 ~50대 대 ~65대)에 유리했습니다.
이것은 특정 소스 모듈을 검사하려는 경우에 대비하여 repo의 소스 구조의 모든 디렉토리에서 작동합니다.
find . -name '*.c' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
이 솔루션은 모든 텍스트 파일(이진 파일, 심지어 버전이 있는 파일도 제외)에서 원인이 되는 행을 세는 것입니다.
IFS=$'\n'
for file in $(git ls-files); do
git blame `git symbolic-ref --short HEAD` --line-porcelain "$file" | \
grep "^author " | \
grep -v "Binary file (standard input) matches" | \
grep -v "Not Committed Yet" | \
cut -d " " -f 2-
done | \
sort | \
uniq -c | \
sort -nr
@nilbus와 @Alex의 조합인 나만의 스크립트를 만들었습니다.
#!/bin/sh
for f in $(git ls-tree -r --name-only HEAD --);
do
j=$(file "$f" | grep -E ': .*text'| sed -r -e 's/: .*//');
if [ "$f" != "$j" ]; then
continue;
fi
git blame -w --line-porcelain HEAD "$f" | grep "^author " | sed 's/author //'`enter code here`
done | sort | uniq -c | sort -nr
MacOS에서 실행되는 단일 소스 파일을 대상으로 하는 Bash 함수입니다.
function glac {
# git_line_author_counts
git blame -w "$1" | sed -E "s/.*\((.*) +[0-9]{4}-[0-9]{2}.*/\1/g" | sort | uniq -c | sort -nr
}
언급URL : https://stackoverflow.com/questions/4589731/git-blame-commit-statistics
'programing' 카테고리의 다른 글
목록 색인을 기준으로 판다 행 선택 (0) | 2023.06.29 |
---|---|
asp:TextBox ReadOnly=true 또는 Enabled=false? (0) | 2023.06.29 |
오라클에서 아토믹 MERGE를 수행할 수 있습니까? (0) | 2023.06.29 |
Spring Boot에서 특정 패턴 대신 모든 요청 매핑 (0) | 2023.06.29 |
mongodbc# 드라이버와 함께 POCO를 사용할 때 _id 필드를 관리하는 방법 (0) | 2023.06.29 |