programing

Git Blame Commit 통계

javamemo 2023. 6. 29. 19:41
반응형

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이라는 유용한 보석을 썼습니다.

설치 및 사용:

  1. $ gem install git_fame
  2. $ cd /path/to/gitdir
  3. $ 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바이너리 홈브루 설치이기 때문에 시스템은 그대로 유지됩니다.

git shortlog -sn

작성자별 커밋 목록이 표시됩니다.

다음은 @Alex의 답변의 주요 부분으로, 책임선을 집계하는 작업을 실제로 수행합니다.파일 집합이 아닌 하나의 파일에서 작동하도록 파일을 줄였습니다.

git blame --line-porcelain path/to/file.txt | grep  "^author " | sort | uniq -c | sort -nr

저는 이 답변에 자주 돌아와서 게시물을 다시 읽고 예시를 다시 소화하여 제가 과세하는 부분을 추출하기 때문에 이 글을 올립니다.제 사용 사례에 충분히 일반적이지도 않습니다. 범위는 전체 C 프로젝트를 대상으로 합니다.


파일당 통계를 나열하고 bash를 사용하여 아카이브합니다.for대신 반복기xargsxargs를 읽을 수 없고 사용/기억하기 어렵기 때문에 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

반응형