GitHubリポジトリからコードの行数を取得できますか?


417

GitHubリポジトリでは、言語で記述されたプロジェクトの割合を表示する「言語統計」を確認できます。ただし、プロジェクトが構成するコードの行数は表示されません。多くの場合、プロジェクトの規模と複雑さの印象をすばやく取得したいと思います。コードの行数は、良い第一印象を与えることができます。500行のコードは比較的単純なプロジェクトを意味し、100,000行のコードは非常に大規模で複雑なプロジェクトを意味します。

それで、できればそれを複製せずに、GitHubリポジトリからさまざまな言語で書かれたコード行を取得することは可能ですか?


Gitリポジトリの行数を数える」という質問は、ローカルGitリポジトリのコード行を数える方法を尋ねますが、

  1. プロジェクトのクローンを作成する必要があります。たとえば、Wineのようなプロジェクトの複製には時間がかかります。
  2. i13nファイルのように、必ずしもコードであるとは限らないファイルの行をカウントします。
  3. (たとえば)Rubyファイルだけを数える、JavaScriptなどの他の言語の大量のコードを見逃してしまう可能性があります。プロジェクトで使用する言語を事前に知っておく必要があります。また、プロジェクトが使用するすべての言語についてカウントを繰り返す必要があります。

全体として、これは「プロジェクトの規模を迅速にチェックする」には時間のかかりすぎる可能性があります。


4
@Schwern:それについて本当に考えなかった。masterブランチの最新のコミットだと思います。
Hubro

8
@Abizern:それが質問を閉じる正当な理由ですか?私はそれをガイドラインで見つけようとしています。私の計画は、まずSOに尋ねることでした。それが役に立たないことが判明した場合は、Githubカスタマーサポートに問い合わせて、回答としてここに投稿します。
Hubro

7
@Abizern:トピックを参照してください。「プログラマーがよく使用するソフトウェアツール」について質問できるという。
Hubro

1
@Hubro 1で解決しましたgit clone --depth 1。2と3に関しては、あなたのために分析を行うことができるソフトウェアがそこにあると思います、そしてあなたはファイル拡張子に基づいて多くの推測をすることができます、しかし私は良い検索を思いついている時間の地獄を持っています上記のソフトウェアを見つけるための用語。多分あなたは別の質問をする必要があります。
シュヴェルン2014年

1
codetabs.com/count-loc/count-loc-online.htmlにオンラインツールがあり、それが良いかどうかは試していません。
Tgr

回答:


298

シェルスクリプト、 cloc-git

このシェルスクリプトを使用して、1つのコマンドでリモート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おそらくあなたのパッケージマネージャでインストールすることができます-例えば、brew install cloc自作。で公開されているdocker imagemribeiro/clocもあります。

スクリプトをインストールするには、そのコードをファイルに保存してcloc-git実行しchmod +x cloc-git、そのファイルを$PATHなどのフォルダに移動します/usr/local/bin

使用法

スクリプトは引数を1つ取ります。これは、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 2015年

12
@linuxdan私のスクリプトはリポジトリ全体を複製しません。--depth 1最新のコミットのみをダウンロードするために渡されます。ほとんどのリポジトリでは、クローン作成に時間がかかりすぎるという元の質問の懸念を回避できます。
Rory O'Kane

2
男、これは驚くほどうまくいきます!私がコーディングした行数は常に疑問に思っていました)
Anatoly Yakimchuk

@ RoryO'Kaneを使用clocして、githubリポジトリ内のコード行を取得し、リポジトリを(onlineを介して)マシンに複製する必要はありませんか。上記のcloc-gitasloは最初にプロジェクトにクローンを作成してから、行数のカウントを開始します
Kasun Siyambalapitiya '22

@KasunSiyambalapitiya申し訳ありませんがcloc、あなたのために実行されているオンラインWebサイトを知りません。clocがコード内の行をカウントするために、コンピュータはそのコードを一時的にだけダウンロードする必要があります。あなたがそれらにアクセスするとき、ウェブブラウザでさえ技術的にウェブページをダウンロードしていることに注意してください。ディスクではなくメモリに保存するだけです。
Rory O'Kane 2016年

226

あなたは次のようなものを実行できます

git ls-files | xargs wc -l

合計数が表示されます→

コード行

または、このツールを使用してくださいhttp://line-count.herokuapp.com/


8
質問に対する短い答え(githubを使用してこの数を見つける)は「いいえ」です。特に、数える必要のあるファイルをすべて除外できるため、あなたのアプローチは2番目に優れた選択肢です。
バーナード

32
あなたは、フィルタ、例えば、Pythonコードにしたい場合:git ls-files | grep '\.py' | xargs wc -l
フェリペSSシュナイダー

3
私はすべてのファイルを手動で行ってxargsから列を合計するwc -lために使用awkしていましたが、OMGの方がはるかに簡単です。
sdkks 2018年

1
この単純なアプローチには、ファイル内のコメントが含まれます。コメントと空白行は、常に「コードの行」とは見なされません。
Mark Stosberg

2
まあ、ドキュメンテーションはコードの大きな部分です。コメントをキックアウトする場合、実際にはどこに線を引きますか。paramsのようなコード情報を含むコメント、次の行のESLintを無効にするコメントはどうですか—コードの後に​​80%コメントがある行はどうですか?これでどこへ行くのか見てください。
Ahmad Awais

129

Google Chromeブラウザーの拡張機能- パブリックおよびプライベートリポジトリで機能するGLOC

プロジェクトのコードの行数を以下からカウントします。

  • プロジェクト詳細ページ
  • ユーザーのリポジトリ
  • 組織ページ
  • 検索結果ページ
  • トレンドページ
  • ページを探索

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください


3
プライベートリポジトリでは機能しないようですが、賛成票を獲得
Michail Michailidis 2017

4
@MichailMichailidisご提案ありがとうございます。直します。
Artem Solovev 2017

4
@Taurus私のコメントはCRを意味するものではありませんでした。ユーザビリティの観点から、グラデーションは機能します(あなたが言及した理由により)私は選択した色のファンではないことを意味しましたが、それは私の(主観的な)意見にすぎません。乾杯:)
tech4242 2017

2
@hellyale確かに。数週間後
アルテムソロヴェフ2017

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に感謝):

一部のリポジトリ(sorich87 / bootstrap-tour)では負の値が発生するため、GitHubのAPIから返されたデータに問題があることを示している可能性があるため、このメソッドの結果を細かく調べます。

更新:

合計行数を計算するこの方法は完全に信頼できるとは言えないようです。詳細については、orbitbotのコメントをご覧ください。


正しい。しかし、プロジェクトが大規模なオープンソースコミュニティプロジェクトであるいくつかのケースでは、この種のカウントは現実的ではありません。
フランクリン

@franklin間違いなく。ただし、このデータはGitHubのAPIでも利用できるため、行の総数を簡単に計算するスクリプトを記述できます。私が書いたばかりの簡単なスクリプトで答えを更新しました。
ルイス、

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
@ルイス私はあなたが1つのコミットで追加/削除された行が他のコミットと同じである可能性があることを無視していると思います、ブランチをマージするときなど、まだ同じ合計にカウントされます。さらに、ユーザープロファイルのGithub コントリビューション統計は、デフォルトのブランチまたはgh-pagesからのみカウントされるため、commit / line統計についても同様のことが行われる可能性があります:help.github.com/articles/…。また、ユーザープロファイルの統計は前年のみを数えますが、グラフページのコミット統計は永続的であると思います。
orbitbot 2016年

38

を使用して最新のコミットだけを複製し、Githubが使用するのと同じソフトウェアであるLinguistgit clone --depth 1 <url>を使用して独自の分析を実行できます。それはあなたがラインを取得するつもりであることを知っている唯一の方法ですコードです。

もう1つのオプションは、API使用して、プロジェクトが使用する言語をリストすることです。行単位ではなくバイト単位で表示されます。例えば...

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

それは簡単に理解できますが、このプロジェクトにはYAMLとJSONが含まれており、Webサイトはこれを認識しますが、APIは認識しません。

最後に、コード検索を使用して、特定の言語に一致するファイルを尋ねることができます。この例では、perl5iのどのファイルがPerlであるかを尋ねます。 https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i。それはあなたに行を与えません、そしてあなたはurl各ファイルに対して返されたものを使って別々にファイルサイズを尋ねなければなりません。


クール、それについて知りませんでした。Githubのウェブサイトでそれができないことを確認できますか?
Hubro

確認できませんが、APIやGithub Webサイトには何も表示されません。すべてのバイトまたはパーセンテージです。クローンを作成する代わりに、APIを使用する理由は何ですか?
シュヴェルン2014年

わかりました、しかし情報をありがとう。Githubのサポートをお願いします。
Hubro、2014年

言語学者はクールに見えます、コードを表示するにはどうすればよいですか?APIと同じように、デフォルトでバイトを表示するように見えます。
Hubro

@Hubro Dunno、パッチを当てる必要があるかもしれません。
Schwern、2014年

33

現在、Github.comまたはそのAPIでは使用できません

私はカスタマーサポートと話しましたが、これはgithub.comでは実行できないことを確認しました。彼らは提案をGithubチームに渡しましたが、うまくいけば将来的にそれが可能になるでしょう。その場合は、必ずこの回答を編集します。

一方、Rory O'Kaneの答えcloc、浅いレポクローンに基づく素晴らしい代替です。


2
直接ではありませんが、Statistics APIには、自分で計算するために必要なすべてのデータが含まれています。これを行う簡単なスクリプトについては、以下の私の回答を参照しください。
ルイス、

12

GitHub APIを使用して、次の関数のようにslocを取得できます

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はどのように決定されますか?すべてのファイルタイプ?特定のディレクトリを除外しますか?
ブレットラインハルト

@BrettReinhard 週あたりの追加と削除の数に基づいてます。すべてのファイルが含まれていると思います。
Yi Kai

それは先週の変更の数を返すだけではありませんか?
ヨハネス '魚' Ziemke

@ Johannes'fish'Ziemkeいいえ、毎週戻ります
Yi Kai

11

FirefoxアドオンGithub SLOC

githubプロジェクトページにコードの行数を出力する小さなFirefoxアドオンを書きました: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 をすぐに取得できますか」という質問の場合、他の回答で述べられているように答えはノーです。

ただし、「プロジェクトの規模をすぐに確認できますか」という質問の場合、私は通常、プロジェクトのサイズを確認して評価します。もちろん、サイズにはすべてのアクティブなコミットからのデルタが含まれますが、大きさのオーダーが非常に近いため、これは良いメトリックです。

例えば

「ドッカー」プロジェクトの大きさは?

ブラウザーで、api.github.com / repos / ORG_NAME / PROJECT_NAMEを入力します。つまり、api.github.com / repos / docker / docker

応答ハッシュで、サイズ属性を見つけることができます。

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

これにより、プロジェクトの相対的な規模がわかります。数値はKBのようですが、自分のコンピューターで確認したところ、実際の桁数は一定でしたが、実際には小さくなっています。(161432KB = 161MB、du -s -h docker = 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. リポジトリフォルダーの削除(オプション)

Powershell:rm -r -force ".\react\"またはMac / Unixの場合:rm -rf ".\react\"

実行されたステップのスクリーンショット(cli-table):

acli-tableとしてのsloc出力

sloc出力(引数なし):

引数なしのsloc出力


これは.Rや.RmdなどのRファイルでは機能しないようです
jzadra

1

各ファイルの行数から出力をパイプして、行数でファイルsortを整理します。 git ls-files | xargs wc -l |sort -n


0

@Tgrのコメントから、オンラインツールがあります:https ://codetabs.com/count-loc/count-loc-online.html

strimzi / strimzi-kafka-operatorリポジトリのLOCカウントの例


0

ターミナルを開き、以下を実行します。

curl https://api.codetabs.com/v1/loc?github=username/reponame
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.