你能从GitHub仓库获取代码行数吗?

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

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


问题“在git仓库中计算代码行数的数量”询问如何计算本地Git仓库中的代码行数,但是:

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

总的来说,这对于“快速检查项目规模”来说可能太耗时了。


4
@Schwern: 没有真正考虑过那个。我想是主分支的最新提交。 - Hubro
15
@Abizern:这是关闭问题的一个有效理由吗?我正在试图在指南中找到答案。我的计划是先在 Stack Overflow 上问,如果没有结果,我会询问 Github 客户支持,并将他们的信息发布为这里的答案。 - Hubro
9
@Abizern:请查看论题相关内容。它指出您可以就“程序员通常使用的软件工具”提问。 - Hubro
5
这里有一个网上工具在https://codetabs.com/count-loc/count-loc-online.html,我还没有尝试过它是否好用。 - Tgr
1
事实是,GitHub并没有提供任何API来获取您的GitHub文件的LOC。您可以做的另一件事是,如果您可以将Sonar服务器与GitHub集成,Sonar确实提供了API以获取您的文件的LOC。 - Amit Mishra
显示剩余5条评论
23个回答

660
你可以运行类似以下的命令:
git ls-files | xargs wc -l

这将给你总计数 →

lines of code

您也可以添加更多的指示。比如只查看JavaScript文件。

git ls-files | grep '\.js' | xargs wc -l

14
是否可以使用GitHub找到这个数字的简短答案是不行的。您的方法是第二好的选择,特别是因为我们可以过滤掉需要计数的任何文件。 - Bernard
85
如果你想筛选 Python 代码,可以使用以下命令: git ls-files | grep '\.py' | xargs wc -l - schneiderfelipe
4
жҲ‘д»ҘеүҚжҳҜжүӢеҠЁдҪҝз”Ёxargsе‘Ҫд»Өе°Ҷwc -lеә”з”ЁдәҺжүҖжңүж–Ү件пјҢ然еҗҺеҶҚдҪҝз”Ёawkе‘Ҫд»ӨжқҘжұӮе’ҢпјҢзҺ°еңЁеҸ‘зҺ°иҝҷж ·еӨӘиҙ№дәӢдәҶгҖӮ - user3905644
2
文档是代码的重要组成部分。如果删除注释,你会在哪里划线呢?那些包含参数等代码信息的注释怎么办?禁用下一行ESLint的注释怎么办?还有80%的注释占据了某些代码后面的行。你看我这是什么意思吧。 - Ahmad Awais
16
这种方法行不通。xargs wc -l不能将整个文件列表传递给单个wc调用——对于大型代码库,它会将文件列表分成较小的列表(以避免超过最大命令长度限制),并且最后一个“total”的值只是最后一个wc的总和。如果您向上滚动,您会看到其他“total”行。根据man xargs的解释: “-n number设置从标准输入中获取的参数数量,以供每次调用工具使用……当前默认值为5000。” 因此,如果您有超过5000个文件,则结果将不正确。 - Logan Pickup
显示剩余18条评论

454

一个名为cloc-git的Shell脚本

你可以使用这个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 执行 brew install cloc。也可以通过 Docker 镜像 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 项目页面上点击“Clone or download”按钮获取这个 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 install linguist然后运行linguist。我无法让它正常工作(问题#2223)。


16
原问题指定不使用克隆代码仓库的方式。 - linuxdan
30
我的脚本并不会克隆整个仓库;它会传递"--depth 1"参数,只下载最新的提交记录。对于大多数仓库而言,这可以避免原问题中关于克隆时间过长的担忧。 - Rory O'Kane
@RoryO'Kane 好的,那很好,但是当存储库太大时会出现问题。无论如何,有没有办法将 cloc 的输出获取到一个数组或某个变量中在 bash 中? - Kasun Siyambalapitiya
请按照“手动运行命令”部分的步骤操作,但增加 --depth 限制或完全删除它,以便下载历史记录中的提交,而不仅仅是最新提交。然后在运行 cloc 之前运行 git checkout b25fb1,其中 b25fb1 是您想要计算行数的历史记录提交的 SHA、分支名称或标签名称。 - Rory O'Kane
1
可能看起来很明显,但如果您已经在本地计算机上拥有代码,则无需再次克隆,只需在存储库上运行cloc即可。 - Adam Reis
显示剩余5条评论

218

我为 Google Chrome 浏览器 创建了一个扩展程序 - GLOC,可以用于公共和私有存储库。

它可以从以下页面统计项目的代码行数:

  • 项目详情页面
  • 用户存储库
  • 组织页面
  • 搜索结果页面
  • 热门页面
  • 探索页面

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here


5
虽然似乎不适用于私有存储库,但已经点赞。 - Michail Michailidis
5
谢谢您的建议。我会进行修改。 - Kas Elvirov
4
@Taurus,我的评论并不是批评。从可用性的角度来看,渐变效果已经很好地完成了任务(就你提到的原因而言)。我只是想说,我个人不太喜欢所选的颜色,这只是我的(主观)意见。谢谢 :) - tech4242
4
我猜这只是在统计行数,而不是代码行数。与SonarQube统计代码行数相比,这个数字要大2-3倍... - Andreas Lundgren
3
嗨,截止到9月底,将发布该版本。您可以订阅此问题 https://github.com/artem-solovev/gloc/issues/104 - Kas Elvirov
显示剩余20条评论

100
如果您访问graphs/contributors页面,您可以看到所有贡献者的列表,以及他们添加和删除的行数。
除非我漏掉了什么,从所有贡献者添加和删除的行数的总和中减去删除的行数总和应该得出repo中代码的总行数。(编辑:最终发现我确实漏掉了一些内容,请查看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代码片段中,更改仓库并单击运行。

免责声明(感谢lovasoa):

请谨慎使用此方法的结果,因为对于某些存储库(sorich87/bootstrap-tour),它会导致负值,这可能表明从GitHub的API返回的数据存在问题。

更新:

看起来计算总行数的这种方法并不完全可靠。请查看orbitbot's comment以获取详细信息。


1
@franklin 当然可以。不过这些数据也可以在GitHub的API中获取,所以你可以编写一个脚本来轻松计算总行数。我刚刚写了一个快速脚本,并更新了我的答案。 - Lewis
3
使用 code_frequency 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
1
嗯...有趣:在sorich87/bootstrap-tour上测试您的代码。结果是负面的。 - lovasoa
@lovasoa 你说得对,看起来API返回的那个仓库的数据有问题。我手动快速地使用贡献者页面上的数据进行了近似计算,结果看起来将会是负数(31349 - 18169 + 72669 - 87594 + 26774 - 27695 + 1211 - 428 = -1883)。我尝试了你的code_frequency版本,它也似乎返回了一个负值,但是不同于我的计算结果。=/ - Lewis
8
@Lewis,我认为你忽略了一件事情,即一次提交中添加/删除的行可以与其他提交相同,例如合并分支等,仍计入同一总数。另外,例如Github用户个人资料的贡献统计仅计算默认分支或gh-pages上的提交,因此可能会发生类似的情况:https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile/ 。此外,请注意用户个人资料统计仅计算前一年,但我认为图形页面上的提交统计是永久的。 - orbitbot
显示剩余4条评论

50

你可以使用命令 git clone --depth 1 <url> 克隆最新的提交记录,然后使用Linguist进行自己的分析,这是Github使用的相同软件。 这是我知道的获取代码行数的唯一方法。

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

$ 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单独查询文件大小。


我无法确认,但是我在API或Github网站上没有看到任何可以给你行数的内容。它们都是以字节或百分比的形式呈现。您使用API而不是克隆的理由是什么? - Schwern
好的,谢谢你提供的信息。我会向Github支持团队询问。 - Hubro
Linguist看起来很酷,但是如何让它显示代码的呢?它似乎默认显示字节,就像API一样。 - Hubro
@Hubro 不太清楚,可能需要打补丁。 - Schwern
1
@RoryO'Kane 由于每个人的编码风格都不同,有些人的代码行比较长,而有些人的则比较短。这样做并不是非常准确。 - xiaoyu2006
显示剩余2条评论

47

目前在Github.com或其API上不支持

我已经与客服联系并确认这在github.com上无法完成。他们已将建议传达给Github团队,希望未来可以实现。如果有的话,我会确保编辑此答案。

同时,Rory O'Kane的回答 是一种基于cloc和浅层存储库克隆的绝佳替代方案。


2
不是直接提供,但是他们的统计API包含了你需要计算的所有数据。请参考下面我的回答,其中有一个快速脚本可以实现这个功能。 - Lewis

39

很遗憾,它不能用于像Git这样的大型代码库。 - sigod

25

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

徽章默认显示存储库的代码行数,您还可以通过使用 ?category= 查询字符串指定它显示其他类别。可以是 code(代码)、blanks(空白)、files(文件)、lines(总共行数)、comments(注释)。

统计文件数

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


1
一旦安装了tokei,您可以简单地导航到文件夹目录并找到它。例如:-$ tokei ./src /*这将给出src文件夹中的行数*/ - danu

15

大家好,这个非常简单...

  1. 从第一个提交创建一个新分支
  2. 当您想了解您的统计信息时,请从主干创建一个新的PR
  3. PR会显示更改行数-由于您正在从第一次提交创建PR,因此所有代码都将被视为新行

另外一个好处是,如果您不批准PR并只是将其留在原地,统计信息(提交数、更改的文件和代码总行数)将随着您将更改合并到主要分支中而保持最新状态。 :)享受吧。

输入图像描述


但是如果第一次提交包含了10000行,那么这个数字并不会显示10000行,对吗? - Luk Aron
1
如果您可以忽略第一次提交,那么这是一个很好的快速检查方法。+1 - Vishal
2
如果你反其道而行,开一个PR删除所有的代码,那么删除的行数将会是整个项目的总行数(减去被忽略的文件)。给自己一点方便,不要合并它。 - johnrom

14
您可以使用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 项目列表和项目详情页面上显示代码行数。你还可以设置个人访问令牌来访问私有仓库并绕过 API 请求频率限制。

您可以从此处下载:https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

源代码可在此处获得:https://github.com/martianyi/github-sloc


对于 Chrome 扩展程序,如何确定 SLOC?所有文件类型都包括吗?是否排除特定目录? - Brett Reinhard
@BrettReinhard,它是基于每周的添加和删除数量(https://developer.github.com/v3/repos/statistics/#get-the-number-of-additions-and-deletions-per-week)计算的,我认为它包括所有文件。 - Yi Kai
这只是返回上周更改次数的数字吗? - Johannes 'fish' Ziemke
@Johannes'fish'Ziemke 不,它每周返回一次。 - Yi Kai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接