在GitHub存储库中,你可以看到“语言统计”,它显示了用某种语言编写的项目的百分比。但是,它不显示项目由多少行代码组成。通常,我想快速了解项目的规模和复杂性,而代码行数可以给人留下良好的第一印象。500行代码意味着一个相对简单的项目,10万行代码意味着一个非常大/复杂的项目。

那么,是否有可能从GitHub存储库中获得以各种语言编写的代码行,最好不克隆它?


“计算git存储库中的行数”问题询问如何计算本地git存储库中的代码行数,但是:

你必须克隆这个项目,这可能是巨大的。例如,克隆Wine这样的项目需要很长时间。 你可以计算文件中不一定是代码的行数,比如i13n文件。 如果您只计算(例如)Ruby文件,那么您可能会错过大量其他语言的代码,比如JavaScript。您必须事先知道项目使用哪些语言。您还必须为项目使用的每种语言重复计数。

总而言之,这对于“快速检查项目规模”来说可能太费时了。


当前回答

你可以使用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));
}

我个人做了一个chrome扩展,显示在github项目列表和项目详细页面SLOC的数量。您还可以设置您的个人访问令牌来访问私有存储库并绕过api速率限制。

你可以从这里下载https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

源代码可在这里https://github.com/martianyi/github-sloc

其他回答

shell脚本,clock -git

你可以使用这个shell脚本用一个命令来计算远程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(“计数代码行数”)。cloc可能可以安装在你的包管理器中——例如,用Homebrew安装cloc。在mribeiro/cloc下还发布了一个docker图像。

您可以通过将脚本代码保存到文件clock -git中,运行chmod +x clock -git,然后将文件移动到$PATH中的文件夹,例如/usr/local/bin,来安装脚本。

使用

该脚本接受一个参数,即git克隆将接受的任何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
-------------------------------------------------------------------------------

选择

手动运行命令

如果不想保存和安装shell脚本,可以手动运行这些命令。一个例子:

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

语言学家

如果你想让结果与GitHub的语言百分比完全匹配,你可以尝试安装Linguist而不是CLOC。根据它的README,你需要gem安装linguist,然后运行linguist。我不能让它工作(第2223期)。

你可以使用tokei:

cargo install tokei
git clone --depth 1 https://github.com/XAMPPRocky/tokei
tokei tokei/

输出:

===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 BASH                    4           48           30           10            8
 JSON                    1         1430         1430            0            0
 Shell                   1           49           38            1           10
 TOML                    2           78           65            4            9
-------------------------------------------------------------------------------
 Markdown                4         1410            0         1121          289
 |- JSON                 1           41           41            0            0
 |- Rust                 1           47           38            5            4
 |- Shell                1           19           16            0            3
 (Total)                           1517           95         1126          296
-------------------------------------------------------------------------------
 Rust                   19         3750         3123          119          508
 |- Markdown            12          358            5          302           51
 (Total)                           4108         3128          421          559
===============================================================================
 Total                  31         6765         4686         1255          824
===============================================================================

Tokei支持徽章:

数线

[![](https://tokei.rs/b1/github/XAMPPRocky/tokei)](https://github.com/XAMPPRocky/tokei)

默认情况下,徽章将显示回购的LoC(代码行),您也可以指定为它显示一个不同的类别,通过使用?category=查询字符串。它可以是代码、空格、文件、行、注释。

计算文件

[![](https://tokei.rs/b1/github/XAMPPRocky/tokei?category=files)](https://github.com/XAMPPRocky/tokei)

还有另一个在线工具,可以计算公共和私人回购的代码行数,而无需克隆/下载它们——https://klock.herokuapp.com/

如果您转到图表/贡献者页面,您可以看到回购的所有贡献者的列表,以及他们添加和删除了多少行。

除非我遗漏了什么,否则从所有贡献者中添加的总行数中减去删除的总行数应该得到repo中代码的总行数。(编辑:事实证明,我还是错过了一些东西。详情请看orbitbot的评论。)

更新:

这些数据也可以在GitHub的API中找到。所以我写了一个快速脚本来获取数据并进行计算:

'use strict'; async function countGithub(repo) { const response = await fetch(`https://api.github.com/repos/${repo}/stats/contributors`) const contributors = await response.json(); const lineCounts = contributors.map(contributor => ( contributor.weeks.reduce((lineCount, week) => lineCount + week.a - week.d, 0) )); const lines = lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount); window.alert(lines); } countGithub('jquery/jquery'); // or count anything you like

只需将其粘贴到Chrome DevTools代码片段中,更改repo并单击运行。

免责声明(感谢lovasoa):

对这种方法的结果持保留态度,因为对于一些回购(sorich87/bootstrap-tour),它的结果是负值,这可能表明从GitHub的API返回的数据有问题。

更新:

看起来这种计算总行数的方法并不完全可靠。详情请看orbitbot的评论。

将每个文件中行数的输出通过管道进行排序,以按行数组织文件。 Git ls-files | xargs wc -l |sort -n