ChatGPT解决这个技术问题 Extra ChatGPT

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

在 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有一个在线工具,没试过好不好用。

A
Ahmad Awais

你可以运行类似的东西

git ls-files | xargs wc -l

这会给你总数 →

https://i.stack.imgur.com/wuFBz.gif

您还可以添加更多说明。就像查看 JavaScript 文件一样。

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

或者使用这个方便的小工具 → https://line-count.herokuapp.com/


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

一个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 clocHomebrew。还有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)。


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

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

计算项目的代码行数:

项目详情页面

用户的存储库

组织页面

搜索结果页面

热门页面

探索页面

https://i.stack.imgur.com/GUy0I.png


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

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

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

更新:

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

'使用严格';异步函数 countGithub(repo) { const response = await fetch(`https://api.github.com/repos/${repo}/stats/contributors`) const 贡献者 = await response.json(); const lineCounts =contributors.map(contributor => (contributor.weeks.reduce((lineCount, week) => lineCount + week.a - week.d, 0)));常量行 = lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount); window.alert(行); } countGithub('jquery/jquery'); // 或者数你喜欢的任何东西

只需将其粘贴到 Chrome DevTools 片段中,更改存储库并单击运行。

免责声明(感谢 lovasoa):

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

更新:

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


正确的。但在某些项目是大型开源社区项目的情况下,这种计数是不可行的。
@富兰克林绝对。但是,此数据也可在 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我认为您忽略了在一个提交中添加/删除的行可能与其他提交相同,合并分支时的fe等仍然计入相同的总数。此外,用户配置文件的 Github 贡献统计仅从默认分支或 gh-pages 计算,因此提交/行统计可能会发生类似情况:help.github.com/articles/…。另请注意,用户个人资料统计信息仅计算上一年,但我认为图表页面上的提交统计信息是永久性的。
j
jidicula

您可以使用 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 看起来很酷,但是如何让它显示代码行呢?看起来它默认显示字节,就像 API 一样。
@RoryO'Kane 由于每个人的编码风格不同,有些行较长,有些则较短。这样做不是很准确。
C
Community

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

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

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


不是直接的,但他们的 Statistics API 拥有您自己计算所需的所有数据。有关执行此操作的快速脚本,请参见下面的 my answer
K
Karbos 538

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

https://i.stack.imgur.com/Ibkz0.png


G
Gorka

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

https://tokei.rs/b1/github/XAMPPRocky/tokei

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

计数文件

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

https://tokei.rs/b1/github/XAMPPRocky/tokei?category=files


Y
Yi Kai

您可以使用 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 不,它每周都会返回
l
lovasoa

Firefox 插件 Github SLOC

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


很棒的插件,很有帮助!您知道是否可以使其与私人回购一起使用?它似乎只在公共回购中显示 LOC。
该链接已失效,并且在手动搜索后,似乎很遗憾该插件不再存在。
也有人要求为 Firefox 提供 GLOC,开发人员似乎对这个想法持开放态度:github.com/artem-solovev/gloc/issues/23
@miyalys 现在完成了:addons.mozilla.org/en-US/firefox/addon/gloc
T
Tobi Obeck
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):

https://i.stack.imgur.com/qv8Se.png

sloc 输出(无参数):

https://i.stack.imgur.com/q7yAU.png

还可以使用 --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
P
Paul M Sorauer

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

从你的第一次提交创建一个新分支当你想找出你的统计数据时,从 main 创建一个新 PR PR 将显示更改的行数 - 当你从第一次提交开始 PR 时,你的所有代码都将是算作新行

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

https://i.stack.imgur.com/ebAON.png


但是如果第一次提交包含 10000 行,那么这个数字不会显示 10000 行,对吗?
如果您有能力忽略第一次提交,那么这是一种快速检查的好方法。 +1
P
Phil Dukhov

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

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

不幸的是,这不适用于私人回购。
不再工作。对于任何 repo,API 都会以“Moved Permanently”响应。
@Magne 它仍然为我工作。请注意,您的回购必须是公开的。您可以试试他们的 UI(codetabs.com/count-loc/count-loc-online.html) 以确保
J
Jimmy Da

如果问题是“您能否快速获得 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)


C
CambodianCoder

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


甚至在底部给我一个总数,这是迄今为止最简单,最快的方法。
M
Mike Bendorf

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

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


s
sicvolo

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

https://i.stack.imgur.com/qP2hQ.png


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

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

吉特

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

资料来源:

我自己的脚本

如何获得第一次提交的 Git diff?

有没有办法添加 git show 行、更改行和删除行?


s
sandypockets

shields.io 有一个可以为您计算所有行数的徽章here。以下是计算 Raycast 扩展 repo 的示例:

https://img.shields.io/tokei/lines/github/raycast/extensions


M
Mohamed Belkamel

我专门为此用途制作了一个 NPM 包,它允许您调用 CLI 工具并提供目录路径和要忽略的文件夹/文件

它是这样的:

npm i -g @quasimodo147/countlines

在终端中获取 $ countlines 命令

那么你可以做countlines . node_modules build dist