您可以从 GitHub 存储库中获取代码行数吗?

Posted

技术标签:

【中文标题】您可以从 GitHub 存储库中获取代码行数吗?【英文标题】:Can you get the number of lines of code from a GitHub repository? 【发布时间】:2015-01-08 23:29:17 【问题描述】:

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

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


问题“Count number of lines in a git repository”询问如何计算本地 Git 存储库中的代码行数,但是:

    您必须克隆该项目,这可能非常庞大。例如,克隆像 Wine 这样的项目需要很长时间。 您可以计算文件中不一定是代码的行数,例如 i13n 文件。 如果您计算 只是(例如)Ruby 文件,您可能会遗漏大量其他语言的代码,例如 javascript。您必须事先知道项目使用哪些语言。您还必须为项目使用的每种语言重复计数。

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

【问题讨论】:

@Schwern:真的没想过。我想是 master 分支的最新提交。 @Abizern:这是结束问题的正当理由吗?我试图找到in the guidelines。我的计划是先问一下。如果这被证明是徒劳的,我会询问 Github 客户支持并在此处发布他们的信息作为答案。 @Abizern:见on-topic。它说你可以问关于“程序员常用的软件工具”的问题。 @Hubro 1 我已经用git clone --depth 1 解决了。至于 2 和 3,我怀疑那里有软件可以为你做分析,你可以根据文件扩展名做很多猜测,但我很难找到一个好的搜索术语查找所述软件。也许你需要问另一个问题。 codetabs.com/count-loc/count-loc-online.html有一个在线工具,好用没试过。 【参考方案1】:

一个shell脚本,cloc-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(“Count Lines of Code”)。 cloc 可能可以与你的包管理器一起安装——例如,brew install cloc 和 Homebrew。还有a docker image published under 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
-------------------------------------------------------------------------------

替代方案

手动运行命令

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

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

语言学家

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

【讨论】:

未克隆 repo 指定的原始问题。 @linuxdan 我的脚本没有克隆整个 repo;它通过--depth 1 只下载最近的提交。对于大多数存储库,这避免了原始问题对克隆时间过长的担忧。 @RoryO'Kane 我们可以使用cloc 获取 github 存储库中的代码行,而无需将 repo 克隆到我们的机器(通过在线)。上面给出的cloc-git aslo 在开始计算行数之前首先克隆到项目 @KasunSiyambalapitiya 抱歉,我不知道有任何在线网站可以为您运行cloc。为了让cloc 计算代码中的行数,您的计算机必须下载该代码,尽管只是暂时的。请注意,即使网络浏览器在您访问网页时也会在技术上下载网页;他们只是将它们保存到内存而不是磁盘。 可能看起来很明显,但是如果您的本地计算机上已经有代码,则无需再次克隆,您只需在 repo 上运行 cloc。【参考方案2】:

你可以运行类似的东西

git ls-files | xargs wc -l

这会给你总数→

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

【讨论】:

对这个问题的简短回答(使用 github 查找这个数字)是否定的。您的方法是第二好的选择,特别是因为我们可以过滤掉我们需要计算出的任何文件。 如果要过滤,例如Python代码:git ls-files | grep '\.py' | xargs wc -l. 我手动将xargswc -l 所有文件然后使用awk 对列求和,天哪,这要容易得多。 嗯,文档是代码的重要组成部分。如果你踢出 cmets,你会在哪里划清界限。包含参数(如参数)的代码信息的 cmets 怎么样,对于下一行禁用 ESLint 的 cmets 怎么样 - 在某些代码之后是 80% cmets 的行怎么样。看看我要去哪里。 此方法无效。 xargs wc -l 不会将整个文件列表传递给单个 wc 调用 - 对于大型存储库,它会将文件列表拆分为较小的列表(以避免超过最大命令长度限制),最后一个“总计”将只能是最后一个wc 的总数。如果向上滚动,您会看到其他“总计”行。来自man xargs:“-n number 设置每次调用实用程序时从标准输入中获取的参数的最大数量...... number 的当前默认值为 5000。”所以如果你有超过 5000 个文件,结果就会不正确。【参考方案3】:

Google Chrome 浏览器有一个扩展程序 - GLOC,适用于公共和私人存储库。

统计一个项目的代码行数:

项目详情页面 用户的存储库 组织页面 搜索结果页面 趋势页面 探索页面

【讨论】:

赞成,尽管它似乎不适用于私有存储库 @MichailMichailidis 谢谢你的建议。我会解决的。 @Taurus 我的评论并不意味着 CR - 从可用性的角度来看,渐变可以完成工作(出于您提到的原因)我的意思是我不是所选颜色的粉丝,但这只是我的(主观)意见。干杯:) 我猜这只是计算行数,而不是代码行数。与 SonarQubes 的 loc 计数相比,这是 2-3 倍... @ShihabShahriarKhan 嗨,伙计。到九月底,它将被释放。你可以订阅这个问题github.com/artem-solovev/gloc/issues/104【参考方案4】:

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

除非我遗漏了什么,否则从所有贡献者之间添加的总行数中减去删除的总行数应该会得出回购中的代码总行数。 (编辑:事实证明我毕竟遗漏了一些东西。请查看orbitbot's comment 了解详细信息。)

更新:

此数据也可在 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 sn-p 中,更改 repo 并点击运行。

免责声明(感谢lovasoa):

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

更新:

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

【讨论】:

对。但在某些项目是大型开源社区项目的情况下,这种计数是不可行的。 @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))) 嗯...有趣:在 sorich87/bootstrap-tour 上测试您的代码。结果是否定的。 @Lewis 我认为您忽略了在一个提交中添加/删除的行可能与其他提交相同,例如当合并仍然计入相同总数的分支等时。此外,f.e.用户配置文件的 Github 贡献统计仅从默认分支或 gh-pages 计算,因此提交/行统计可能会有类似的情况:help.github.com/articles/…。另请注意,用户个人资料统计信息仅计算上一年,但我认为图表页面上的提交统计信息是永久的。【参考方案5】:

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

另一个选项是use the API to list the languages the project uses。它不是以行为单位,而是以字节为单位。比如……

$ curl https://api.github.com/repos/evalEmpire/perl5i/languages

  "Perl": 274835

尽管对此持保留态度,但该项目 includes YAML and JSON which the web site acknowledges 但 API 没有。

最后,您可以使用code search 询问哪些文件与给定语言匹配。这个例子询问 perl5i 中的哪些文件是 Perl。 https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i。它不会给你行,你必须使用每个文件返回的url单独询问文件大小。

【讨论】:

酷,不知道。不过,你能确认它不能在 Github 网站上完成吗? 我无法确认,但我在 API 或 Github 网站上看不到任何可以为您提供线路的内容。都是字节或百分比。您通过 API 而不是克隆的理由是什么? 好的,不过感谢您提供的信息。我会请求 Github 支持。 Linguist 看起来很酷,但是你如何让它向你展示 lines 的代码呢?看起来它默认显示字节,就像 API 一样。 @RoryO'Kane 由于每个人的编码风格不同,有些行较长,有些则较短。这样做不是很准确。【参考方案6】:

目前无法在 Github.com 或其 API-s 上实现

我已与客户支持交谈并确认无法在 github.com 上完成此操作。不过,他们已将该建议传递给 Github 团队,因此希望将来可以实现。如果是这样,我一定会编辑这个答案。

同时,Rory O'Kane's answer 是基于 cloc 和浅回购克隆的出色替代方案。

【讨论】:

不是直接的,但他们的Statistics API 拥有您自己计算所需的所有数据。请参阅下面的 my answer 以获取执行此操作的快速脚本。【参考方案7】:

来自@Tgr 的评论,有一个在线工具: https://codetabs.com/count-loc/count-loc-online.html

【讨论】:

【参考方案8】:

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

【讨论】:

对于 chrome 扩展,SLOC 是如何确定的?所有文件类型?排除特定目录? @BrettReinhard 它基于the number of additions and deletions per week,我认为它包括所有文件。 那不就是返回上周的变化次数吗? @Johannes'fish'Ziemke 不,它每周都会返回【参考方案9】:

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

默认情况下,徽章将显示 repo 的 LoC(代码行),您还可以使用 ?category= 查询字符串指定它显示不同的类别。它可以是代码、空白、文件、行、cmets。

计数文件

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

【讨论】:

【参考方案10】:

Firefox 插件 Github SLOC

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

【讨论】:

很棒的插件,很有帮助!您知道是否可以使其与私人回购一起使用?它似乎只在公共回购中显示 LOC。 链接失效了,手动搜索后,看来这个插件已经不存在了。 有人要求将 GLOC 也用于 Firefox,开发人员似乎对这个想法持开放态度:github.com/artem-solovev/gloc/issues/23 @miyalys 现在完成了:addons.mozilla.org/en-US/firefox/addon/gloc【参考方案11】:
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"

使用说明及说明

    从 npm 安装sloc,一个命令行工具(需要安装Node.js)。
npm install sloc -g
    克隆浅层存储库(下载速度比完整克隆快)。
git clone --depth 1 https://github.com/facebook/react/
    运行 sloc 并指定应分析的路径。
sloc ".\react\src" --format cli-table

sloc 支持将输出格式化为cli-tablejsoncsv。正则表达式可用于排除文件和文件夹 (Further information on npm)。

    删除存储库文件夹(可选)

Powershell:rm -r -force ".\react\" 或在 Mac/Unix 上:rm -rf ".\react\"

已执行步骤的屏幕截图(cli-table):

sloc 输出(无参数):

还可以使用--details 选项获取每个文件的详细信息:

sloc ".\react\src" --format cli-table --details     

【讨论】:

这似乎不适用于 .R 或 .Rmd 等 R 文件 @jzadra 它应该可以工作。 R 被记录为受支持的语言 npmjs.com/package/sloc#supported-languages 否则在 github 上创建问题 github.com/flosse/sloc/issues【参考方案12】:

如果问题是“您能否快速获得 github repo 的 NUMBER OF LINES”,则答案是否定的,如其他答案所述。

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

例如

“docker”项目有多大?

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

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


    ...
    size: 161432,
    ...

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

【讨论】:

【参考方案13】:

嘿,这一切都非常容易......

    从您的第一次提交创建一个新分支 如果您想了解自己的统计数据,请从 main 创建一个新 PR PR 将向您显示更改的行数 - 当您从第一次提交开始执行 PR 时,您的所有代码都将被计为新行

另外的好处是,如果您不批准 PR 并将其保留在原处,则统计信息(提交次数、更改的文件和总代码行数)将在您合并时保持最新变为主要。 :) 享受吧。

【讨论】:

但是如果第一次提交包含 10000 行,那么这个数字不会显示 10000 行吗?【参考方案14】:

打开终端并运行以下命令:

curl -L "https://api.codetabs.com/v1/loc?github=username/reponame"

【讨论】:

不幸的是,这不适用于私人回购。 不再起作用。 API 以“永久移动”响应任何 repo。【参考方案15】:

将每个文件中的行数输出到sort 以按行数组织文件。 git ls-files | xargs wc -l |sort -n

【讨论】:

即使在底部给我一个总数,这是迄今为止最简单,最快的方法。【参考方案16】:

如果您使用 Vscode 并且先克隆项目,这将非常容易。只需安装Lines of Code (LOC) Vscode 扩展,然后从命令面板运行LineCount: Count Workspace Files

该扩展程序按文件类型显示摘要统计信息,并按每个文件夹输出带有详细信息的结果文件。

【讨论】:

【参考方案17】:

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

【讨论】:

看起来很有希望,但很奇怪,你必须注册它。 我认为是因为它不想超过一个帐户的API请求限制,所以它要求每个人登录所以它计入自己的帐户。但是“这个应用程序将能够读取和写入所有公共和私有存储库数据。”要求人们承担的风险不成比例。【参考方案18】:

这里没有一个答案能满足我的要求。我只想使用现有的实用程序。以下脚本将使用基本实用程序:

吉特 GNU 或 BSD awk GNU 或 BSD sed 重击

获取添加到存储库的总行数(从添加的行中减去删除的行)。

#!/bin/bash
git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD | \
sed 's/[^0-9,]*//g' | \
awk -F, '!($2 > 0) $2="0";!($3 > 0) $3="0"; print $2-$3'

获取按已知源代码的指定文件类型(例如*.py 文件或添加更多扩展名等)过滤的代码行。

#!/bin/bash
git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD -- *.py,java,js | \
sed 's/[^0-9,]*//g' | \
awk -F, '!($2 > 0) $2="0";!($3 > 0) $3="0"; print $2-$3'

4b825dc642cb6eb9a060e54bf8d69288fbee4904 是 Git 中“空树”的 id,它在每个存储库中始终可用。

来源:

我自己的脚本 How to get Git diff of the first commit? Is there a way of having git show lines added, lines changed and lines removed?

【讨论】:

以上是关于您可以从 GitHub 存储库中获取代码行数吗?的主要内容,如果未能解决你的问题,请参考以下文章

前端可以用js获取textarea中当前光标位置的行数吗?

您可以从 github 存储库中的另一个目录导入 python 模块吗? [复制]

通过 Github API 从 Github 存储库中获取所有文件名

使用 go get 从 WSL 2 上的私有 github 存储库中获取依赖项

如何在 Github 存储库中添加多个项目文件夹

如何从 CLI 下载 GitHub 存储库中的子文件夹/文件