GitHub 리포지토리에서 여러 줄의 코드를 얻을 수 있습니까?


417

GitHub 리포지토리 에는 언어로 작성된 프로젝트 의 백분율 을 표시하는 "언어 통계"가 표시 됩니다. 그러나 프로젝트가 몇 줄의 코드로 구성되어 있는지 표시하지는 않습니다. 종종 프로젝트의 규모와 복잡성에 대한 인상을 빨리 얻고 싶으며 코드 줄 수는 좋은 첫 인상을 줄 수 있습니다. 500 줄의 코드는 비교적 간단한 프로젝트를 의미하고, 100,000 줄의 코드는 매우 크고 복잡한 프로젝트를 의미합니다.

그렇다면 GitHub 리포지토리에서 다양한 언어로 작성된 코드 줄을 얻을 수 있습니까?


git 저장소 에서 줄 수 계산”질문은 로컬 Git 저장소에서 코드 줄을 계산하는 방법을 묻지 만 다음과 같습니다.

  1. 대규모 일 수있는 프로젝트를 복제해야합니다. 예를 들어 와인과 같은 프로젝트를 복제하는 데는 시간이 걸립니다.
  2. i13n 파일과 같이 코드가 아닐 수도있는 파일의 행을 계산합니다.
  3. 예를 들어 Ruby 파일 계산 하면 JavaScript와 같은 다른 언어로 된 대량의 코드를 놓칠 수 있습니다. 프로젝트에서 사용하는 언어를 미리 알고 있어야합니다. 또한 프로젝트에서 사용하는 모든 언어에 대해 카운트를 반복해야합니다.

대체로 이것은“프로젝트 규모를 신속하게 확인”하기에는 시간이 너무 많이 소요됩니다.


4
@ Schwern : 정말 그렇게 생각하지 않았습니다. 마스터 브랜치의 최신 커밋이라고 생각합니다.
Hubro

8
@Abizern : 이것이 질문을 닫는 유효한 이유입니까? 나는 지침에서 그것을 찾으려고 노력하고있다 . 나의 계획은 먼저 SO를 요청하는 것이었다. 그것이 쓸데없는 것으로 판명되면 Github 고객 지원 센터에 문의하여 답변을 여기에 게시하십시오.
Hubro

7
@Abizern : 주제를 참조하십시오 . "프로그래머가 일반적으로 사용하는 소프트웨어 도구"에 대해 질문 할 수 있습니다.
Hubro

1
@Hubro 1로 해결했습니다 git clone --depth 1. 2와 3은 분석을 수행 할 수있는 소프트웨어가 있다고 생각하며 파일 확장자를 기반으로 많은 추측을 할 수 있지만 좋은 검색을하는 데 시간이 많이 걸립니다. 상기 소프트웨어를 찾는 용어. 다른 질문이 필요할 수도 있습니다.
Schwern

1
codetabs.com/count-loc/count-loc-online.html에 온라인 도구가 있는데 , 그것이 좋은지 시도하지 않았습니다.
Tgr

답변:


298

쉘 스크립트 cloc-git

이 셸 스크립트를 사용하면 하나의 명령으로 원격 Git 리포지토리의 줄 수를 계산할 수 있습니다.

#!/usr/bin/env bash
git clone --depth 1 "$1" temp-linecount-repo &&
  printf "('temp-linecount-repo' will be deleted automatically)\n\n\n" &&
  cloc temp-linecount-repo &&
  rm -rf temp-linecount-repo

설치

이 스크립트는 CLOC (“Count Lines of Code”)가 설치되어 있어야합니다. cloc패키지 관리자 (예 : Homebrew ) brew install cloc와 함께 설치할 수 있습니다 . 도 있습니다 에서 발표 된 고정 표시기 이미지 .mribeiro/cloc

코드를 파일에 저장하고 cloc-git실행 chmod +x cloc-git한 다음 파일을와 $PATH같은 폴더로 이동 하여 스크립트를 설치할 수 있습니다 /usr/local/bin.

용법

스크립트는 하나의 인수를 취하는데,이 인수 git clone는 허용 할 URL입니다 . 예는 https://github.com/evalEmpire/perl5i.git(HTTPS) 또는 git@github.com:evalEmpire/perl5i.git(SSH)입니다. “복제 또는 다운로드”를 클릭하면 모든 GitHub 프로젝트 페이지에서이 URL을 얻을 수 있습니다.

출력 예 :

$ cloc-git https://github.com/evalEmpire/perl5i.git
Cloning into 'temp-linecount-repo'...
remote: Counting objects: 200, done.
remote: Compressing objects: 100% (182/182), done.
remote: Total 200 (delta 13), reused 158 (delta 9), pack-reused 0
Receiving objects: 100% (200/200), 296.52 KiB | 110.00 KiB/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
('temp-linecount-repo' will be deleted automatically)


     171 text files.
     166 unique files.                                          
      17 files ignored.

http://cloc.sourceforge.net v 1.62  T=1.13 s (134.1 files/s, 9764.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                           149           2795           1425           6382
JSON                             1              0              0            270
YAML                             2              0              0            198
-------------------------------------------------------------------------------
SUM:                           152           2795           1425           6850
-------------------------------------------------------------------------------

대안

명령을 수동으로 실행

쉘 스크립트를 저장하고 설치하지 않으려면 명령을 수동으로 실행할 수 있습니다. 예를 들면 :

$ git clone --depth 1 https://github.com/evalEmpire/perl5i.git
$ cloc perl5i
$ rm -rf perl5i

언어 학자

결과가 GitHub의 언어 비율과 정확히 일치하도록하려면 CLOC 대신 Linguist 를 설치하십시오 . README 에 따르면 실행 해야 합니다 . 작동시키지 못했습니다 ( 문제 # 2223 ).gem install linguistlinguist


6
리포지토리를 복제하지 않고 지정된 원래 질문입니다.
linuxdan

12
@linuxdan 내 스크립트는 전체 저장소를 복제하지 않습니다. --depth 1가장 최근의 커밋 만 다운로드하도록 전달 합니다. 대부분의 리포지토리에서는 복제 시간이 너무 오래 걸리는 원래 질문의 우려를 피할 수 있습니다.
Rory O'Kane

2
이거 놀랍게 작동합니다! 항상 궁금해, 내가 몇 줄을 코딩했는지)
Anatoly Yakimchuk

@ RoryO'Kane은 cloc저장소를 온라인으로 복제하지 않고 github 저장소에 코드 줄을 가져 오는 데 사용할 수 있습니다 . 위의 주어진 cloc-gitaslo는 복제를하기 전에 처음으로 프로젝트를 시작합니다
Kasun Siyambalapitiya

@KasunSiyambalapitiya 죄송합니다 cloc. 귀하를 위해 운영되는 온라인 웹 사이트를 모르겠습니다 . 위해서는 cloc코드의 라인을 계산하는 컴퓨터는하지만 일시적으로 만, 그 코드를 다운로드 할 수 있습니다. 웹 브라우저조차도 웹 페이지를 방문 할 때 기술적으로 웹 페이지를 다운로드합니다. 디스크 대신 메모리에 저장합니다.
Rory O'Kane

226

당신은 같은 것을 실행할 수 있습니다

git ls-files | xargs wc -l

총계를 줄 것입니다 →

코드 라인

또는이 도구를 사용하십시오 → http://line-count.herokuapp.com/


8
질문에 대한 짧은 대답 (github을 사용 하여이 숫자 찾기)은 아니요입니다. 특히 카운트 아웃해야 할 파일을 필터링 할 수 있기 때문에 두 번째 최선의 대안입니다.
Bernard

32
예를 들어 Python 코드를 필터링하려는 경우 : git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider

3
내가 뭐하고 있었 xargswc -l수동으로 다음 사용하는 모든 파일을 awk열 합계를, OMG이 너무 쉽습니다.
sdkks

1
이 간단한 접근 방식에는 파일에 주석이 포함됩니다. 주석과 빈 줄이 항상 "코드 줄"로 간주되는 것은 아닙니다.
Mark Stosberg

2
글쎄, 문서는 코드의 큰 부분입니다. 주석을 내면 실제로 선을 어디에 그리겠습니까? params와 같은 코드 정보가 포함 된 주석은 다음 줄에 ESLint를 비활성화하는 주석은 어떤 코드 다음에 주석이 80 % 인 주석은 어떻게됩니까? 내가 어디로 가는지 보라.
Ahmad Awais 19 :

128

에 대한 확장이 구글 크롬 브라우저 - GLOC 공공 및 민간의 repos 작동합니다.

프로젝트의 코드 줄 수를 다음에서 계산합니다.

  • 프로젝트 상세 페이지
  • 사용자의 저장소
  • 조직 페이지
  • 검색 결과 페이지
  • 인기 페이지
  • 페이지 탐색

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


3
비공개 저장소를 위해 작동하지 않지만 upvoted
미하일 Michailidis

4
@MichailMichailidis 제안 해 주셔서 감사합니다. 내가 고칠 게
Artem Solovev

4
@Taurus 내 의견은 CR로 의미가 없었습니다-유용성 관점에서 그라디언트는 작업을 수행합니다. 건배 :)
tech4242

2
@hellyale 확실합니다. 몇 주 안에
Artem Solovev

2
@hellyale 개인 저장소에서도 작동합니다. 확장 프로그램을 업데이트하십시오. 사용할 새로운 기능이 더 있습니다
Artem Solovev

70

그래프 / 기고자 페이지로 이동하면 저장소에 대한 모든 기고자 목록과 추가 및 제거 된 행 수를 볼 수 있습니다.

내가 빠진 것이 아닌 한, 모든 기고자 사이에 추가 된 총 라인 수에서 삭제 된 총 라인 수를 빼면 리포지토리의 총 코드 라인 수를 산출해야합니다. (편집 : 결국 무언가가 누락 된 것으로 나타났습니다. 자세한 내용 은 orbitbot의 의견 을보십시오.)

최신 정보:

이 데이터는 GitHub의 API 에서도 사용할 수 있습니다 . 그래서 데이터를 가져 와서 계산을 수행하는 빠른 스크립트를 작성했습니다.

'use strict';

function countGithub(repo) {
fetch('https://api.github.com/repos/'+repo+'/stats/contributors')
    .then(response => response.json())
    .then(contributors => contributors
        .map(contributor => contributor.weeks
            .reduce((lineCount, week) => lineCount + week.a - week.d, 0)))
    .then(lineCounts => lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount))
    .then(lines => window.alert(lines));
}

countGithub('jquery/jquery'); // or count anything you like

Chrome DevTools 스 니펫에 붙여넣고 리포지를 변경 한 후 실행을 클릭하십시오.

면책 조항 ( lovasoa 덕분에 ) :

일부 repos (sorich87 / bootstrap-tour)의 경우 음수 값을 나타내므로 GitHub의 API에서 반환 된 데이터에 문제가 있음을 나타낼 수 있으므로 소금 한 알을 사용하여이 방법의 결과를 가져옵니다.

최신 정보:

총 라인 수를 계산하는이 방법이 완전히 신뢰할 수있는 것은 아닙니다. 자세한 내용 은 orbitbot의 의견 을 살펴보십시오 .


권리. 그러나 프로젝트가 대규모 오픈 소스 커뮤니티 프로젝트 인 경우에는 이런 종류의 계산이 불가능합니다.
franklin

@franklin 확실히. 그러나이 데이터는 GitHub의 API 에서도 사용할 수 있으므로 스크립트를 작성하여 총 줄 수를 매우 쉽게 계산할 수 있습니다. 방금 작성한 빠른 스크립트로 답변을 업데이트했습니다.
Lewis

code_frequecy API를 사용하는 것이 더 간단합니다. 제공 : fetch("https://api.github.com/repos/jquery/jquery/stats/code_frequency").then(x=>x.json()).then(x=>alert(x.reduce((total,changes)=>total+changes[1]+changes[2],0)))
lovasoa

흠 ... 흥미로운 : sorich87 / bootstrap-tour에서 코드를 테스트하십시오. 결과는 부정적입니다.
lovasoa

3
@Lewis 한 커밋에서 추가 / 제거 된 행이 다른 커밋과 동일 할 수 있다는 것을 무시하고 있다고 생각합니다. 또한, 사용자 프로필 철 Github에서 기여 통계는 기본 분기 또는 GH-페이지에서 계산됩니다, 그래서는 / 라인 통계를 커밋 동안 계속 비슷한있을 수 있습니다 : help.github.com/articles/...은 . 또한 사용자 프로필 통계는 전년도 만 계산하지만 그래프 페이지의 커밋 통계는 영구적이라고 생각합니다.
orbitbot

38

Github에서 사용하는 것과 동일한 소프트웨어 인 Linguist를 사용하여 최신 커밋을 복제 git clone --depth 1 <url>한 다음 자체 분석을 수행 할 수 있습니다 . 그것이 당신이 코드 을 얻는다는 것을 아는 유일한 방법 입니다.

또 다른 옵션은 API를 사용하여 프로젝트에서 사용하는 언어를 나열하는 것 입니다. 줄이 아니라 바이트 단위로 제공합니다. 예를 들어 ...

$ curl https://api.github.com/repos/evalEmpire/perl5i/languages
{
  "Perl": 274835
}

소금 한 덩어리로 가져가더라도 해당 프로젝트 에는 웹 사이트가 인정 하지만 API는 인정 하지 않는 YAML 및 JSON이 포함됩니다 .

마지막으로 코드 검색 을 사용 하여 특정 언어와 일치하는 파일을 요청할 수 있습니다. 이 예제는 perl5i의 어떤 파일이 Perl인지 묻습니다. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. 줄을 제공하지 않으며 url각 파일에 대해 반환 된 파일을 사용하여 파일 크기를 별도로 요청해야 합니다.


쿨, 그것에 대해 몰랐다. 그래도 Github 웹 사이트에서 수행 할 수 없음을 확인할 수 있습니까?
Hubro

확인할 수는 없지만 API 또는 Github 웹 사이트에서 줄을 찾을 수있는 항목이 없습니다. 모든 바이트 또는 백분율입니다. 복제 대신 API를 통해이를 수행하는 이유는 무엇입니까?
Schwern

그래, 정보 주셔서 감사합니다. Github 지원을 요청할 것입니다.
Hubro

언어 학자 외모는 냉각,하지만 어떻게 당신은 당신에게 보여주기 위해 어떻게해야합니까 불구하고 코드를? API와 마찬가지로 기본적으로 바이트를 표시하는 것처럼 보입니다.
Hubro

@Hubro Dunno, 패치해야 할 수도 있습니다.
Schwern

33

현재 Github.com 또는 API에서 사용할 수 없습니다

고객 지원 센터에 문의하여 github.com에서이 작업을 수행 할 수 없음을 확인했습니다. 그들은 제안을 Github 팀에 전달했지만 앞으로도 가능할 것입니다. 그렇다면이 답변을 수정하십시오.

한편 Rory O'Kane의 답변cloc얕은 리포 클론을 기반으로 한 훌륭한 대안 입니다.


2
직접은 아니지만 통계 API 에는 직접 계산하는 데 필요한 모든 데이터가 있습니다. 이 작업을 수행하는 빠른 스크립트에 대해서는 아래 답변을 참조하십시오 .
Lewis

12

GitHub API를 사용하여 다음 함수와 같은 슬로크를 얻을 수 있습니다

function getSloc(repo, tries) {

    //repo is the repo's path
    if (!repo) {
        return Promise.reject(new Error("No repo provided"));
    }

    //GitHub's API may return an empty object the first time it is accessed
    //We can try several times then stop
    if (tries === 0) {
        return Promise.reject(new Error("Too many tries"));
    }

    let url = "https://api.github.com/repos" + repo + "/stats/code_frequency";

    return fetch(url)
        .then(x => x.json())
        .then(x => x.reduce((total, changes) => total + changes[1] + changes[2], 0))
        .catch(err => getSloc(repo, tries - 1));
}

개인적으로 github 프로젝트 목록과 프로젝트 세부 정보 페이지에 SLOC 수를 보여주는 크롬 확장을 만들었습니다. 개인 리포지토리에 액세스하고 API 속도 제한을 무시하도록 개인 액세스 토큰을 설정할 수도 있습니다.

https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn 에서 다운로드 할 수 있습니다.

소스 코드는 https://github.com/martianyi/github-sloc에 있습니다.


크롬 확장의 경우 SLOC는 어떻게 결정됩니까? 모든 파일 형식? 특정 디렉토리를 제외 하시겠습니까?
Brett Reinhard

@BrettReinhard 주당 추가 및 삭제 수를 기반으로 하므로 모든 파일이 포함되어 있다고 생각합니다.
Yi Kai

지난 주에 변경된 수만 반환하지 않습니까?
Johannes '물고기'Ziemke

@ Johannes'fish'Ziemke 아니요, 매주 반환
Yi Kai

11

Firefox 애드온 Github SLOC

github 프로젝트 페이지에 여러 줄의 코드를 인쇄하는 작은 파이어 폭스 애드온을 작성했습니다 : Github SLOC


훌륭한 플러그인, 매우 유용합니다! 개인 저장소와 함께 사용할 수 있는지 알고 있습니까? 공개 리포지토리에만 LOC를 표시하는 것 같습니다.
rococo

링크가 죽었고 수동으로 검색 한 후에 슬프게도이 플러그인이 더 이상 존재하지 않는 것 같습니다.
dCSeven

Firefox에서도 GLOC를 사용할 수 있도록 요청하는 개발자가 있으며 개발자는 github.com/artem-solovev/gloc/issues/23
miyalys

1
@miyalys 이제 끝났습니다 : addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar

7

질문이 " github 저장소의 NUMBER OF LINES 를 빠르게 얻을 수 있습니까? "인 경우 다른 답변에서 언급 한대로 답변이 없습니다.

그러나 질문이 " 프로젝트의 스케일 을 신속하게 확인할 수 있습니까?"인 경우 대개 프로젝트의 크기를보고 측정합니다. 물론 크기에는 모든 활성 커밋의 델타가 포함되지만 크기 순서가 매우 가깝기 때문에 좋은 지표입니다.

예 :

"docker"프로젝트는 얼마나 큽니까?

브라우저에서 api.github.com/repos/ORG_NAME/PROJECT_NAME을 입력하십시오 (예 : api.github.com/repos/docker/docker)

응답 해시에서 size 속성을 찾을 수 있습니다.

{
    ...
    size: 161432,
    ...
}

이것은 프로젝트의 상대적 규모에 대한 아이디어를 제공해야합니다. 숫자는 KB로 보이지만 컴퓨터에서 확인했을 때 크기의 순서가 일치하더라도 실제로 더 작습니다. (161432KB = 161MB, du -s -h 도커 = 65MB)


1
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"

지침 및 설명

  1. 명령 행 도구 인 npm 에서 sloc을 설치하십시오 ( Node.js 를 설치해야 함).
npm install sloc -g
  1. 얕은 저장소 복제 (전체 복제보다 다운로드 속도가 빠름).
git clone --depth 1 https://github.com/facebook/react/
  1. sloc을 실행 하고 분석해야 할 경로를 지정하십시오.
sloc ".\react\src" --format cli-table

sloc은 출력을 a cli-table, as json또는 로 형식화 할 수 csv있습니다. 정규식을 사용하여 파일 및 폴더를 제외 할 수 있습니다 ( npm에 대한 추가 정보 ).

  1. 저장소 폴더 삭제 (선택 사항)

파워 쉘 : rm -r -force ".\react\" 또는 Mac / Unix :rm -rf ".\react\"

실행 된 단계의 스크린 샷 (cli-table) :

acli-table로 sloc 출력

슬로크 출력 (인수 없음) :

인수없이 sloc 출력


이 .R 또는 .Rmd 같은 R 파일에 대한 작업에 표시되지 않습니다
jzadra

1

각 파일의 행 수에서 출력을 파이프하여 sort파일을 행 수별로 구성하십시오. git ls-files | xargs wc -l |sort -n



0

터미널을 열고 다음을 실행하십시오.

curl https://api.codetabs.com/v1/loc?github=username/reponame
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.