자식 리포지토리의 줄 수 계산


766

git 저장소의 모든 파일에있는 총 줄 수를 어떻게 계산합니까?

git ls-files git에 의해 추적 된 파일 목록을 제공합니다.

cat모든 파일 에 대한 명령을 찾고 있습니다. 같은 것

git ls-files | [cat all these files] | wc -l

답변:


1139

xargs 당신이 원하는 것을 할 것입니다 :

git ls-files | xargs cat | wc -l

그러나 더 많은 정보와 더 나은 정보를 통해 다음을 수행 할 수 있습니다.

git ls-files | xargs wc -l

11
나는 사소한 것 같아; 소스 코드 파일 만 포함하는 방법 (예 : * .cpp) bin 파일을 커밋했습니다.
Daniel

39
그때 grep cpp |전에 거기에 붙어 xargs.
Carl Norum

35
git ls-files -z | xargs -0 wc -l이름에 공백이있는 파일이있는 경우 사용하십시오 .
mpontillo

34
특정 파일을 포함 / 제외하려면 다음을 사용하십시오. git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lgrep 부분은 원하는 펄 정규식입니다!
Gabriel

29
.java 파일에 관심이 있다면 다음을 사용할 수 있습니다.git ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

이것은 빈 트리와 현재 작업 트리의 차이점을 보여줍니다. 현재 작업 트리의 모든 줄을 계산합니다.

현재 작업 트리에서 숫자를 얻으려면 다음을 수행하십시오.

git diff --shortstat `git hash-object -t tree /dev/null`

다음과 같은 문자열을 제공합니다 1770 files changed, 166776 insertions(+).


45
BTW,을 실행하여 해시를 얻을 수 있습니다 git hash-object -t tree /dev/null.
ephemient

84
그리고 더 간결하게 :git diff --stat `git hash-object -t tree /dev/null`
rpetrich

10
위 버전에서 계산 된 아카이브 또는 이미지와 같은 이진 파일은 계산하지 않으므로 더 나은 soloution입니다!
BrainStone

31
+1 바이너리가 계산되지 않으므로이 솔루션이 더 좋습니다. 또한 우리는 정말 그냥 자식은 diff 출력의 마지막 줄에 관심이있다 :git diff --stat `git hash-object -t tree /dev/null` | tail -1
가브리엘 Petronella

31
대신 git diff --shortstat `git hash-object -t tree /dev/null` 마지막 줄을 얻는 데 사용 하면 꼬리가 필요하지 않습니다.
Jim Wolff

316

프로젝트의 범위에 대한 아이디어를 원하기 때문에이 수를 원한다면 CLOC (“코드 라인 수”) 의 출력을 선호 할 수 있습니다.이 코드는 언어별로 중요하고 중요하지 않은 코드 라인을 세분화합니다.

cloc $(git ls-files)

(이 라인은 동일하다 git ls-files | xargs cloc.이 사용 sh$()명령 대체 기능).

샘플 출력 :

      20 text files.
      20 unique files.                              
       6 files ignored.

http://cloc.sourceforge.net v 1.62  T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                       2             13            111            309
JSON                             3              0              0             58
HTML                             2              7             12             50
Handlebars                       2              0              0             37
CoffeeScript                     4              1              4             12
SASS                             1              1              1              5
-------------------------------------------------------------------------------
SUM:                            14             22            128            471
-------------------------------------------------------------------------------

CLOC를 먼저 설치해야합니다. 당신은 아마 수 있습니다 설치 cloc패키지 관리자로 - 예를 들어, brew install cloc브루 .

cloc $(git ls-files)종종 개선되었습니다 cloc .. 예를 들어, 위의 샘플 출력에는 git ls-files471 줄의 보고서가 있습니다. 동일한 프로젝트의 cloc .경우 Git-ignored node_modules폴더 의 종속성을 검색하기 때문에 무려 456,279 줄을보고하고 실행하는 데 6 분이 걸립니다 .


4
CLOC는 TypeScript와 같은 일부 언어를 무시합니다.
Marcelo Camargo

6
@MarceloCamargo 현재이 시점에서 TypeScript가 지원됩니다
Alexander

1
초보자는 라인을 계산하기 위해 "cloc DIRECTORY_WHERE_YOUR_GIT_IN"을 실행하는 것이 좋습니다.

전체 설명은 여기에 있습니다 : github.com/AlDanial/cloc 그리고 바이너리는 여기 있습니다 : github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto

15
cloc --vcs git요즘 사용 하면 이름이 잘못된 파일 (또는 너무 많은 파일)의 일부 경우를 피할 수 있습니다 .
seanf

56

git ls-files | xargs wc -l많은 수의 파일을 처리 할 때 일괄 처리 문제가 발생했습니다 . 여기서 행 수는 여러 total행 으로 청크됩니다 .

의문의 여지 가 있습니다 wc 유틸리티는 왜 "total"로 여러 줄을 생성합니까? , 문제를 무시하는 다음 명령을 찾았습니다.

wc -l $(git ls-files)

또는 코드와 같은 일부 파일 만 검사하려는 경우 :

wc -l $(git ls-files | grep '.*\.cs')


이것은 훌륭하지만 공백이 포함 된 경로에서는 실패하는 것 같습니다. 그것을 해결할 방법이 있습니까?
Lea Hayes

1
grep '. * \. m'에서 .mp3, .mp4와 같은 이진 파일을 선택하는 데 문제가있었습니다. find 명령을 사용하여 코드 파일을 나열하면 더 많은 성공을 거두었습니다.wc -l $(git ls-files | find *.m *.h)
Tico Ballagas

3
@LeaHayes 이것은 한 가지 방법 wc -l --files0-from=<(git ls-files -z)입니다. <(COMMAND)구문은 내용의 결과 파일의 이름을 반환합니다 COMMAND.

@buck 감사합니다.하지만 '프로세스 대체를 위해 파이프를 만들 수 없습니다. 함수가 구현되지 않았습니다. wc : 인식 할 수없는 옵션 --files0-from ='명령을 실행하면 오류가 발생합니다. 어떤 아이디어?
Lea Hayes

1
@LeaHayes 나는 당신을 위해 일할 것이라고 생각하는이 스크립트를 생각해 냈습니다 :```#! / bin / bash results = $ (git ls-files | xargs -d '\ n'wc -l) let grand_total = 0 for x in $ (echo "$ results"| egrep '[[: digit :]] + total $'); grand_total + = $ (echo "$ x"| awk '{print $ 1}') echo "$ {results}"echo "총합계 : $ {grand_total}"```
buck

45

어쨌든 나에게 가장 좋은 해결책은 @ephemient의 답변에 대한 설명에 묻혀있다. 나는 그것을 눈에 띄지 않도록 여기로 끌어 당기고 있습니다. 이에 대한 크레딧은 @FRoZeN (및 @ephemient)으로 가야합니다.

git diff --shortstat `git hash-object -t tree /dev/null`

추가 노이즈없이 repo 작업 디렉토리에있는 총 파일 및 행을 리턴합니다. 보너스로 소스 코드 만 계산됩니다. 바이너리 파일은 탈리에서 제외됩니다.

위의 명령은 Linux 및 OS X에서 작동합니다. 크로스 플랫폼 버전은

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

그것은 Windows에서도 작동합니다.

빈 줄을 제외하기위한 옵션은

  • -w/ --ignore-all-space,
  • -b/ --ignore-space-change,
  • --ignore-blank-lines,
  • --ignore-space-at-eol

와 함께 사용할 때 아무런 영향을 미치지 않습니다 --shortstat. 빈 줄이 계산됩니다.


1
git mktree </dev/null또는 true|git mktree또는 git mktree <&-또는 :|git mktree우리 가운데 키 입력 카운터 :-) 위해 - REPO 주위에 떠 여분의 빈 나무 상처 아무것도하려고하지 않습니다.
jthill

2
해시가 무엇인지 궁금해하는 사람들을 위해 : stackoverflow.com/questions/9765453/…
Tejas Kale

19

이것은 cloc 1.68부터 작동합니다 .

cloc --vcs=git


--vcs나를 위해 일하지 않았다, 아마도 제거되었을 수 있습니다. cloc .git repo에서 일하는 동안 OTOH.
acdcjunior

13

나는 cmder ( http://gooseberrycreative.com/cmder/ ) 로 놀고 있었고 html, css, java 및 javascript의 줄을 세고 싶었습니다. 위의 답변 중 일부는 근무하는 동안, or(나는 여기 - 그렙의 패턴은하지 않았다 /unix/37313/how-do-i-grep-for-multiple-patterns 내가 가진 것을) 그것을 탈출

그래서 이것은 내가 지금 사용하는 것입니다 :

git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l


2
이것은 나를 위해 덩어리로 응답하는 것처럼 보였습니다. 저스틴 아쿠아 드로의 솔루션과 함께 당신의 grep을 사용하는 것이 나에게 도움이되었습니다. wc -l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
Peter Mark

9

나는 다음을 사용한다 :

git grep ^ | wc -l

이것은 ^줄의 시작을 나타내는 정규 표현식을 위해 git에 의해 버전이 지정된 모든 파일을 검색 하므로이 명령은 총 줄 수를 제공합니다!


3

나는 이걸했다:

git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l

이것은 저장소의 모든 텍스트 파일을 관심있는 파일로 계산하는 경우 작동합니다. 일부가 문서 등으로 간주되는 경우 제외 필터를 추가 할 수 있습니다.


3

github https://github.com/flosse/sloc 의이 도구 는보다 설명적인 방식으로 출력을 제공 할 수 있습니다. 소스 코드의 통계를 만듭니다.

  • 물리적 라인
  • 코드 라인 (소스)
  • 주석이있는 줄
  • 한 줄 주석
  • 블록 주석이있는 줄
  • 소스와 주석이 섞인 줄
  • 빈 줄

1

시험:

find . -type f -name '*.*' -exec wc -l {} + 

해당 디렉토리 / 디렉토리에


0
: | git mktree | git diff --shortstat --stdin

또는:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin

0

이진 파일을 포함할지 여부에 따라 두 가지 솔루션이 있습니다.

  1. git grep --cached -al '' | xargs -P 4 cat | wc -l
  2. git grep --cached -Il '' | xargs -P 4 cat | wc -l

    "xargs -P 4"는 4 개의 병렬 프로세스를 사용하여 파일을 읽을 수 있음을 의미합니다. 매우 큰 리포지토리를 검색하는 경우이 기능이 도움이 될 수 있습니다. 기계의 용량에 따라 프로세스 수가 증가 할 수 있습니다.

    -a, 이진 파일을 텍스트로 처리 (이진 포함)
    -l '', 일치하는 줄 대신 파일 이름 만 표시 (빈 파일이 아닌 파일 만 스캔)
    -I, 이진 파일의 패턴과 일치하지 않음 (이진 제외)-
    캐시, 작업 트리 대신 색인에서 검색 (커밋되지 않은 파일 포함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.