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
내가 뭐하고 있었 xargs에 wc -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.