关于git:你能从GitHub存储库中获取代码行数吗?

Can you get the number of lines of code from a GitHub repository?

在GitHub存储库中,您可以看到"语言统计信息",它显示用一种语言编写的项目的百分比。但是,它不会显示项目包含的代码行数。通常,我希望能够快速了解??项目的规模和复杂性,并且代码行数可以给人留下良好的第一印象。 500行代码意味着一个相对简单的项目,100,000行代码意味着一个非常大/复杂的项目。

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

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

  • 你必须克隆项目,这可能是巨大的。例如,克隆像Wine这样的项目需要很长时间。
  • 您可以计算文件中不一定是代码的行,例如i13n文件。
  • 如果你只计算(例如)Ruby文件,你可能会错过其他语言的大量代码,比如JavaScript。您必须事先知道项目使用的语言。您还必须重复项目使用的每种语言的计数。
  • 总而言之,这对于"快速检查项目规模"来说可能太耗费时间。


    一个shell脚本,cloc-git

    您可以使用此shell脚本使用一个命令计算远程Git存储库中的行数:

    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env bash
    git clone --depth 1"$1" temp-linecount-repo &&
      printf"('temp-linecount-repo' will be deleted automatically)


    " &&
      cloc temp-linecount-repo &&
      rm -rf temp-linecount-repo

    安装

    此脚本需要安装CLOC("计数代码行")。 cloc可能与您的软件包管理器一起安装 - 例如,brew install cloc with Homebrew。还有一个在mribeiro/cloc下发布的码头图像。

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

    用法

    该脚本采用一个参数,即git clone将接受的任何URL。示例是https://github.com/evalEmpire/perl5i.git(HTTPS)或[email protected]:evalEmpire/perl5i.git(SSH)。您可以通过单击"克隆或下载"从任何GitHub项目页面获取此URL。

    示例输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    $ 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脚本,可以手动运行命令。一个例子:

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

    语言学家

    如果您希望结果与GitHub的语言百分比完全匹配,您可以尝试安装Linguist而不是CLOC。根据其自述文件,您需要gem install linguist然后运行linguist。我无法让它工作(问题#2223)。


    You can simply run something like

    1
    git ls-files | xargs wc -l

    这会给你总数→

    lines of code

    或者使用此工具→http://line-count.herokuapp.com/


    Google Chrome浏览器有一个扩展程序 - GLOC适用于公共和私人回购。

    计算项目的代码行数:

    • 项目详细页面
    • 搜索结果页面
    • 趋势页面
    • 等等

    One repo
    Many repos


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

    除非我遗漏了某些内容,否则从所有贡献者中添加的总行数中减去删除的行总数应该会产生回购中代码行的总数。 (编辑:事实证明我毕竟失去了一些东西。看看orbitbot的评论细节。)

    更新:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'use strict';

    //replace jquery/jquery with the repo you're interested in
    fetch('https://api.github.com/repos/jquery/jquery/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));

    只需将其粘贴到Chrome DevTools代码段中,即可更改回购并点击"运行"。

    免责声明(感谢lovasoa):

    用这种方法得到一粒盐的结果,因为对于一些repos(sorich87 / bootstrap-tour),它会产生负值,这可能表明从GitHub的API返回的数据有问题。

    更新:

    看起来这种计算总行数的方法并不完全可靠。有关详细信息,请查看orbitbot的评论。


    您可以使用git clone --depth 1 克隆最新的提交,然后使用与Github使用的相同软件Linguist执行您自己的分析。这是我知道你将获得代码行的唯一方法。

    另一种选择是使用API??列出项目使用的语言。它不以行为单位给出它们,而是以字节为单位。例如...

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

    尽管如此,该项目还包括网站承认的YAML和JSON,但API没有。

    最后,您可以使用代码搜索来询问哪些文件与给定语言匹配。此示例询问perl5i中的哪些文件是Perl。 https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i。它不会为您提供行,您必须使用每个文件的返回url分别请求文件大小。


    目前无法在Github.com或其API上使用

    我已经与客户支持部门进行了交谈,并确认无法在github.com上完成此操作。他们已经将建议传递给了Github团队,所以希望将来有可能。如果是这样,我一定会编辑这个答案。

    同时,Rory O'Kane的答案是基于cloc和浅层回购克隆的出色选择。


    您可以使用GitHub API获取类似以下函数的sloc

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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


    Firefox附加组件Github SLOC

    我写了一个小的firefox插件,它打印了github项目页面上的代码行数:Github SLOC


    如果问题是"你能快速获得github回购的数量",那么答案就不是其他答案所说明的。

    但是,如果问题是"您能否快速检查项目的SCALE",我通常会通过查看项目的大小来衡量项目。当然,大小将包括来自所有活动提交的增量,但它是一个很好的度量,因为数量级非常接近。

    例如。

    "码头工程"项目有多大?

    在浏览器中输入api.github.com/repos/ORG_NAME/PROJECT_NAME
    即api.github.com/repos/docker/docker

    在响应哈希中,您可以找到size属性:

    1
    2
    3
    4
    5
    {
        ...
        size: 161432,
        ...
    }

    这应该让您了解项目的相对规模。这个数字似乎是以KB为单位,但是当我在计算机上检查它时,它实际上更小,即使数量级是一致的。 (161432KB = 161MB,du -s -h docker = 65MB)