642

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

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


问题“<a href="https://stackoverflow.com/q/4822471/388916">Count number of lines in a git repository”询问如何计算本地 Git 存储库中的代码行数,但是:

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

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

4

18 回答 18

412

一个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。还有一个 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 项目页面获取此 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)。

于 2015-03-12T14:43:30.283 回答
406

你可以运行类似的东西

git ls-files | xargs wc -l

这会给你总数 →

代码行

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

于 2018-01-14T21:15:22.253 回答
178

我为Google Chrome 浏览器创建了一个扩展- GLOC,它适用于公共和私人回购。

计算项目的代码行数:

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

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

于 2017-02-23T19:30:19.150 回答
92

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

除非我遗漏了一些东西,否则从所有贡献者之间添加的总行数中减去删除的总行数应该会得出 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 片段中,更改存储库并单击运行。

免责声明(感谢lovasoa):

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

更新:

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

于 2015-08-22T09:03:00.363 回答
43

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

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

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

尽管对此持保留态度,但该项目包括网站承认但 API 不承认的 YAML 和 JSON。

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

于 2014-11-12T07:32:00.223 回答
39

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

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

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

于 2014-11-14T11:34:36.213 回答
23

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

srimzi/strimzi-kafka-operator 存储库的 LOC 计数示例

于 2020-05-20T11:47:04.170 回答
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 项目列表和项目详细信息页面上显示 SLOC 的数量。您还可以设置您的个人访问令牌以访问私有存储库并绕过 api 速率限制。

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

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

于 2017-03-29T10:15:43.353 回答
14

您可以使用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= 查询字符串指定它显示不同的类别。它可以是代码、空白、文件、行、注释。

计数文件

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

于 2021-04-08T15:24:32.120 回答
12

Firefox 插件Github SLOC

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

于 2016-01-14T14:46:33.790 回答
10
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 支持将输出格式化为cli-table, asjsoncsv. 正则表达式可用于排除文件和文件夹(有关 npm 的更多信息)。

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

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

执行步骤截图(cli-table):

sloc 输出为 acli 表

sloc 输出(无参数):

sloc 输出不带参数

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

sloc ".\react\src" --format cli-table --details     
于 2019-10-02T19:26:24.947 回答
8

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

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

例如

“码头工人”项目有多大?

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

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

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

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

于 2015-03-31T00:22:54.790 回答
8

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

curl -L "https://api.codetabs.com/v1/loc?github=username/reponame"
于 2020-06-13T01:57:02.813 回答
8

嘿,这一切都太容易了……

  1. 从您的第一次提交创建一个新分支
  2. 当你想找出你的统计数据时,从 main 创建一个新的 PR
  3. PR 将向您显示更改的行数 - 当您从第一次提交开始执行 PR 时,您的所有代码都将被计为新行

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

在此处输入图像描述

于 2020-11-02T22:37:11.507 回答
7

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

于 2020-02-05T04:07:26.680 回答
4

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

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

于 2021-09-21T17:35:20.163 回答
2

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

截屏

于 2020-07-23T16:32:35.357 回答
0

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

  • 吉特
  • 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,它在每个存储库中始终可用。

资料来源:

于 2021-10-26T23:05:27.003 回答