在 GitHub 存储库中,您可以看到“语言统计信息”,它显示了以某种语言编写的项目的百分比。但是,它不会显示项目包含多少行代码。通常,我想快速了解项目的规模和复杂性,而代码行数可以给人留下良好的第一印象。 500 行代码意味着一个相对简单的项目,100,000 行代码意味着一个非常大/复杂的项目。
那么,是否有可能从 GitHub 存储库中获取以各种语言编写的代码行,最好不克隆它?
问题“Count number of lines in a git repository”询问如何计算本地 Git 存储库中的代码行数,但是:
您必须克隆项目,这可能是巨大的。例如,克隆像 Wine 这样的项目需要很长时间。您将计算文件中不一定是代码的行数,例如 i13n 文件。如果只计算(例如)Ruby 文件,您可能会错过大量其他语言的代码,例如 JavaScript。您必须事先知道项目使用哪些语言。您还必须为项目使用的每种语言重复计数。
总而言之,这对于“快速检查项目规模”来说可能过于耗时。
git clone --depth 1
解决了。至于 2 和 3,我怀疑那里有软件可以为你做分析,你可以根据文件扩展名做很多猜测,但我很难找到一个好的搜索术语查找所述软件。也许你需要问另一个问题。
你可以运行类似的东西
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/
一个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)。
--depth 1
只下载最近的提交。对于大多数存储库,这避免了原始问题对克隆时间过长的担忧。
cloc
来获取 github 存储库中的代码行,而无需将 repo 克隆到我们的机器(通过在线)。上面给出的 cloc-git
在开始计算行数之前首先克隆到项目
cloc
。为了让 cloc
计算代码中的行数,您的计算机必须下载该代码,尽管只是暂时的。请注意,即使网络浏览器在您访问网页时也会在技术上下载网页;他们只是将它们保存到内存而不是磁盘。
我为 Google Chrome 浏览器 创建了一个扩展程序 - GLOC,它适用于公共和私人存储库。
计算项目的代码行数:
项目详情页面
用户的存储库
组织页面
搜索结果页面
热门页面
探索页面
https://i.stack.imgur.com/GUy0I.png
如果您转到图表/贡献者页面,您可以看到所有贡献者的列表以及他们添加和删除的行数。
除非我遗漏了一些东西,否则从所有贡献者之间添加的总行数中减去删除的总行数应该会得出 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 了解详细信息。
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)))
您可以使用 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.com 或其 API-s 上使用
我已经与客户支持进行了交谈,并确认这不能在 github.com 上完成。不过,他们已将该建议传递给 Github 团队,因此希望将来可以实现。如果是这样,我一定会编辑这个答案。
同时,Rory O'Kane's answer 是基于 cloc
和浅回购克隆的出色替代方案。
从@Tgr 的评论中,有一个在线工具:https://codetabs.com/count-loc/count-loc-online.html
https://i.stack.imgur.com/Ibkz0.png
您可以使用 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
您可以使用 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
Firefox 插件 Github SLOC
我写了一个小的 Firefox 插件,可以打印 github 项目页面上的代码行数:Github SLOC
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-table
、json
或 csv
。正则表达式可用于排除文件和文件夹 (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
嘿,这一切都太容易了……
从你的第一次提交创建一个新分支当你想找出你的统计数据时,从 main 创建一个新 PR PR 将显示更改的行数 - 当你从第一次提交开始 PR 时,你的所有代码都将是算作新行
额外的好处是,如果您不批准 PR 并将其保留在原地,则统计信息(提交次数、文件更改和代码总行数)将在您将更改合并到 main 时保持最新. :) 享受。
https://i.stack.imgur.com/ebAON.png
打开终端并运行以下命令:
curl -L "https://api.codetabs.com/v1/loc?github=username/reponame"
如果问题是“您能否快速获得 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)
将每个文件中行数的输出通过管道传输到 sort
以按行数组织文件。 git ls-files | xargs wc -l |sort -n
如果您使用 Vscode 并先克隆项目,这将非常简单。只需安装 Lines of Code (LOC)
Vscode 扩展程序,然后从命令面板运行 LineCount: Count Workspace Files
。
该扩展程序按文件类型显示摘要统计信息,它还按每个文件夹输出带有详细信息的结果文件。
在另一个在线工具中,它可以计算公共和私人存储库的代码行数,而无需克隆/下载它们 - https://klock.herokuapp.com/
https://i.stack.imgur.com/qP2hQ.png
这里没有一个答案能满足我的要求。我只想使用现有的实用程序。以下脚本将使用基本实用程序:
吉特
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 行、更改行和删除行?
shields.io 有一个可以为您计算所有行数的徽章here。以下是计算 Raycast 扩展 repo 的示例:
https://img.shields.io/tokei/lines/github/raycast/extensions
我专门为此用途制作了一个 NPM 包,它允许您调用 CLI 工具并提供目录路径和要忽略的文件夹/文件
它是这样的:
npm i -g @quasimodo147/countlines
在终端中获取 $ countlines
命令
那么你可以做countlines . node_modules build dist
不定期副业成功案例分享
git ls-files | grep '\.py' | xargs wc -l
。xargs
到wc -l
所有文件,然后使用awk
对列求和,天哪,这要容易得多。xargs wc -l
不会将整个文件列表传递给单个wc
调用 - 对于大型存储库,它会将文件列表拆分为较小的列表(以避免超过最大命令长度限制),最后一个“总计”将只能是最后一个wc
的总和。如果向上滚动,您会看到其他“总计”行。 Fromman xargs
:“-n number 设置每次调用实用程序时从标准输入中获取的参数的最大数量...... number 的当前默认值为 5000。”因此,如果您有超过 5000 个文件,则结果将不正确。